我有一个在多个商店中使用的delphi程序。这些商店都连接到在线mysql数据库。在应用程序启动时,程序连接到数据库。当计算机未连接到互联网时,该程序正在冻结。我发现以下程序测试计算机是否连接到互联网:
public
function IsConnectedToInternet: Boolean;
const
INTERNET_CONNECTION_MODEM = 1;
INTERNET_CONNECTION_LAN = 2;
INTERNET_CONNECTION_PROXY = 4;
INTERNET_CONNECTION_MODEM_BUSY = 8;
implementation
function InternetGetConnectedState(lpdwFlags: LPDWORD;
dwReserved: DWORD): BOOL; stdcall; external 'WININET.DLL';
function TForm1.IsConnectedToInternet: Boolean;
var
dwConnectionTypes: Integer;
begin
try
dwConnectionTypes := INTERNET_CONNECTION_MODEM +
INTERNET_CONNECTION_LAN +
INTERNET_CONNECTION_PROXY;
if InternetGetConnectedState(@dwConnectionTypes, 0) then
Result := true
else
Result := false;
except
Result := false;
end;
end;
procedure Tform1.FormCreate(Sender: TObject);
begin
If IsConnectedToInternet then
MysqlConnection.Connect;
end;
如果计算机连接到 wifi 等,这可以正常测试。但它不会测试此连接是否具有互联网访问权限。例如,如果计算机连接到限制为10GB的wifi,并且当10gb用完时,计算机仍将连接到wifi,但无法访问互联网。
在这种情况下,上面的函数将给出 true 的结果,使程序尝试连接,这将使程序冻结。
如何解决此错误?是否有测试计算机是否具有互联网访问权限的程序?
答案 0 :(得分:2)
检查连接的唯一可靠方法是尝试连接。这样做可能会阻止尝试连接的线程。然后,逻辑结论是,要阻止UI线程被阻止,您必须从UI线程以外的线程进行连接。
答案 1 :(得分:0)
在您的使用中添加单位“WinNet”。使用“InternetGetConnectedState”函数返回Internet状态和类型的值。见下文:
function YourFunctionName : boolean;
var
origin : cardinal;
begin
result := InternetGetConnectedState(@origin,0);
//connections origins by origin value
//NO INTERNET CONNECTION = 0;
//INTERNET_CONNECTION_MODEM = 1;
//INTERNET_CONNECTION_LAN = 2;
//INTERNET_CONNECTION_PROXY = 4;
//INTERNET_CONNECTION_MODEM_BUSY = 8;
end;