2014-02-23 19 views
0

我有一個在多個商店中使用的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; 

這工作在測試正常,如果計算機是連接無線等。但它不如果這個測試連接有互聯網接入。例如,如果電腦連接到10GB的無線網絡,當10GB用完時,電腦仍會連接到無線網絡,但無法訪問互聯網。

在這種情況下,上述功能將給出結果true使程序嘗試連接,這將使程序凍結。

我該如何解決這個錯誤?是否有程序測試電腦是否有互聯網訪問

+5

爲什麼要檢查?只是試圖連接。如果它有效,那麼你就連接起來了。如果失敗了,那你就不是。 –

+4

那麼正確的做法是保持你的gui線程的db連接代碼。並使您的程序在連接失敗時健壯。如果你真的想停止你的程序凍結,你不會把數據庫代碼放在GUI線程上。 –

+0

@DavidHeffernan您是否建議我創建一個連接到服務器的獨立單元? –

回答

2

檢查連接性的唯一可靠方法是嘗試連接。這樣做可以阻止嘗試連接的線程。那麼合乎邏輯的結論是,要阻止UI線程被阻塞,您必須從UI線程以外的線程進行連接。

0

添加您的使用單位「WinNet」。使用「InternetGetConnectedState」函數返回互聯網狀態和類型的值。見下:

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; 
+0

正如問題所解釋的那樣:「在這種情況下,上述功能會導致程序嘗試連接的真實結果,這會使程序凍結。」,所以它沒有幫助 – mjn

+0

爲了避免凍結主窗口,這是好的該函數在一個線程中實現 –

+0

使用「WinInet」與我一起工作 – Dreamer64

相關問題