如何偵測winxp已經開完機? |
答題得分者是:Coffee
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
請問各位! 我寫一支socket程式在server 端, 另外在client端也有一支偵測server主機是連線的socket程式, 如果偵測連線ok的話, 就到主機端連接資料庫-> 開啟資料庫-> 執行程式, 但這支程式我必須放在xp系統的啟動中, 這樣產生了一個問題, 每一台xp的開機速度都不一樣, 有的開的很快, 有的開的很慢, 開的快的(就是網路連線已上來的), xp進入啟動連線我的程式連上主機一切都沒有問題, 但開的慢的, 網路連線還沒有啟動, 就進入[啟動]執行我的程式, 結果造成我的程式偵測無法連線我的主機, 使得程式跳出, 所以我想, 如果可以偵測xp系統已經開完機後, 我再進行我的程式中網路偵測的一段程式碼(就算我的程式被先啟動, 我也可以偵測 xp到開機完成後我再進行), 那要如何做才能知道xp已經完全開機完成了, 謝謝! |
lcjan
初階會員 發表:11 回覆:60 積分:29 註冊:2002-03-13 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
不知道我這樣說是否正確?
WINDOW在登錄前其實網路是還沒有連線的, 因為我發現當使用者登入之後才會依序啟動一些程式, 例如NAVIDA的驅動, 輸入法, 而通常網路連線是在很後面才會被啟動, 而我有一支程式是要掛在啟動區來執行連線到我的主機資料庫, 但往往在啟動區內的程式都會優先於網路連線動作之前被執行, 所以就會造成我的程式一直在嘗試連線主機, 最後會當機出錯, 因此如果我能在程式中加入偵測XP已完成網路連線後, 我再啟動程式連主機, 就不會造成連線資料庫因TIMEOUT而出問題! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
偵測網路是否連線
unit Unit1; interface uses Windows, Messages, SysUtils, wininet,Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var Types : Integer; begin { CopyRight (C) Bowman } { MatthewBowman@21cn.com } Types := INTERNET_CONNECTION_MODEM INTERNET_CONNECTION_LAN INTERNET_CONNECTION_PROXY; //check 3 conditions together if InternetGetConnectedState(@types, 0) then Edit1.Text := 'your pc is Online now' else Edit1.Text := 'your pc is offline now'; end; end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
再來另一個
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin if GetSystemMetrics(SM_NETWORK) and $0001 = $0001 then edit1.text:='Machine is OnLine' else edit1.text:='Machine is OffLine'; end; end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
lcjan
初階會員 發表:11 回覆:60 積分:29 註冊:2002-03-13 發送簡訊給我 |
WINDOW在登錄前其實網路是還沒有連線的
關於這一點我做了一個簡單的測試,使用A電腦一直Ping B電腦,然後把B電腦重新開機,當B電腦開到Win XP的登入畫面時,A電腦的Ping就已經有回應了。這表示B電腦雖然沒有任何人登入,但網路連線是正常的(除非您是登入後需要撥接ADSL或VPN)。 另一個例子,如果你用過VNC遠端連線到某電腦,當你把遠端電腦重新開機後,等一段時間後您就可以利用VNC遠端連線並且登入電腦,如果該電腦沒有使用者登入就沒網路連線的話,那很多伺服器一重開機MIS人員不就得臨機處理? ===================引 用 文 章=================== 不知道我這樣說是否正確? WINDOW在登錄前其實網路是還沒有連線的, 因為我發現當使用者登入之後才會依序啟動一些程式, 例如NAVIDA的驅動, 輸入法, 而通常網路連線是在很後面才會被啟動, 而我有一支程式是要掛在啟動區來執行連線到我的主機資料庫, 但往往在啟動區內的程式都會優先於網路連線動作之前被執行, 所以就會造成我的程式一直在嘗試連線主機, 最後會當機出錯, 因此如果我能在程式中加入偵測XP已完成網路連線後, 我再啟動程式連主機, 就不會造成連線資料庫因TIMEOUT而出問題! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝 lcjan兄測試, 不過lcjan兄可能有些誤解我的意思了, 您的A PING B, B重新開機到登入畫面, A PING得到 B這是當然的, 因為B進入XP登錄時網卡已開始運作, 但我的 A 是 CLIENT端, B是主機(主機是不關機的), 當A開機登入後, 在BOOT區有一支程式會主動被執行, 同時因為在我的B SERVER上有一支 SOCKET SERVER, A 有一支 SOCKET CLIENT啟動時會探測B SERVER是否存在, 如果存在則開始嘗試連接資料庫(資料庫為 INTERBASE, 直接透過TCP/IP方式連線), 如果啟動中 A 探測不到 B SERVER的回應, 就立即跳出, 而現在的狀況是 A 已探測到 B的存在了, 接下來立刻嘗試連結 B SERVER的資料庫, 可是這個時候, A的系統其實還沒有完全開好, 也就是在網路還沒有READY好要透過TCP/IP來做雙向資料傳輸, 在控制台-網路設定中有一個CHECKBOX是 "連線後,在通知區域內顯示連線"的選項, 如果這個被點選的話, 當A的網路已READY後會在TRAY BAR右下出現網路連線圖示, 我的意思是如果這個圖示沒有被顯示出來時, 我的程式在 A CLIENT是無法連通 B SERVER的, 所以我希望是能偵測到這個動作完成後再進行 A 連 B的作業, 以免因為連線過長出現 TIMEOUT問題而導致當機, 但很可惜, WINXP從啟動到網路連線這段時間因每台電腦狀況不同, 有的可能只要1分鐘, 有的可能要長到4-5分鐘, 所以我沒有辦法去寫一個迴路去計算, 這也是我一開始就說, 要如果能偵測XP在 IDLE的閒置下, 一定代表所有東西都開好了, 或許我用語不清有些誤解, 造成各位麻煩, 實在抱歉, 不過樓上各位有提出的方法我會一一測試, 看看是否有幫助, 謝謝!
|
lcjan
初階會員 發表:11 回覆:60 積分:29 註冊:2002-03-13 發送簡訊給我 |
P.D.兄您好:
我提供一下我的經驗, 我也寫過一支Client - Server 程式, 用Delphi 5 的 ClientSocket 與 ServerSocket, Client端也是在電腦登入後會自動執行, 然後連上主機, 上傳資料, 但我不是上傳到資料庫. 這樣的方式沒有遇到開機登入緩慢而導致無法上傳. 還是您的資料庫連線在Client端需要先執行必要的驅動程式或函式庫, 但在您登入初始化時資料庫連線Driver尚未被執行而您的程式就先跑起來. 您要不要考慮登入後遞延幾秒執行, 再加上失敗後重複嘗試連線幾次..試試 |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
謝謝您支持,
1.因為我寫的是一支資料庫管理應用程式(前台門市作業), 所以一定是要連資料庫, 但至於interbase(firebird)資料庫系統透過TCP/IP來連結的過程如何, 沒有文獻可以查詢, 所以這個問題很難解決 2.延遲幾秒的問題, 就如我之前所說, 每一台開機狀況都不同, 延遲迴圈很難掌握, SOCKET部份在XP一開機立即可偵測, 接下來要等多久, 不是我能控制, 我的經驗, 在一台PC剛裝好XP時, 約在1分鐘內可完成XP開機, 此時我放在啟動中執行是沒有問題, 而大多數用了約4-5個月後, 同樣在啟動的程式卻會出現TIMEOUT, 所以我現在都把啟動中的程式移到桌面, 然後告訴客戶等XP開完在手動點選執行, 只是這樣在於門市系統似乎怪怪的! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
說對了, 我只要連上B的資料庫就可以知道是否READY, 但問題是, 當我下CONNECT要連資料庫之後, 系統就卡住了, 因為它在嘗試連資料庫, 直到出現TIMEOUT, 就我所知, MS-SQL下CONNECT之後約莫45-60秒內如果連不上會出現TIMEOUT而當出, INTERBASE約在90-120秒之間, 而我就是希望避開這樣的問題, 也就是我不希望是因為下CONNECT連資料庫出錯才知道連線未READY, 而是能事先就知道XP的網路連線READY後, 我再進行 CONNECT , 雖然結果是一樣, 但是對設計除錯上來說意義卻完全不同, 因為一旦出現TIMEOUT 我不知道後面是否會有其他的後遺症發生, 所以當然是不要錯最好, 不是嗎? 謝謝!
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
那麼..這樣如何..利用Connection來連線..當Exception產生時就拋出false,既不會真正把Exception丟給User,也不會讓程式出問題。
function GetConnection(var ADOConnection : TADOConnection):boolean; begin try ADOConnection.Open; Result:=ADOConnection.Connected; except Result:=false; end; end; procedure TForm.InitialProc; begin while (not CancelInitial) do begin if GetConnection(aADOConnection) then break else sleep(20*1000); end; end;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
那麼就讓程式在未初始化完成的時候不要出現視窗,留個TrayIcon就好,
如果要讓User 知道目前的進度,就產生第二個Form來播放Progress Bar, 這也就是為什麼我會有個Cancel的flag在那,這麼一來程式不會看起來當掉, 另外User也只有Cancel的Button可以按(或者是在你認為的某些時機下去控制flag讓程式停止) 我是認為這樣的Exception是可以被控制的,雖然說已經拋出,但在預定的flow已經被控制,我認為仍然是可行的。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
lcjan
初階會員 發表:11 回覆:60 積分:29 註冊:2002-03-13 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
所以..你想要的是像這個?
Case WNetAddConnection3(Application.Handle, netRes,PChar(PassWord) , PChar(PassWord), CONNECT_UPDATE_PROFILE) of NO_ERROR: Result := '連線完成'; ERROR_ALREADY_ASSIGNED: Result := '本地磁碟機字元已經被指定 '#13#10 Driver ':' MappingDriverRemoteName(Driver); ERROR_ACCESS_DENIED: Result := '存取網路資源被拒'; ERROR_BAD_DEV_TYPE: Result := '本地設備形態與網路資源不符合'; ERROR_BAD_DEVICE: Result := '本地磁碟機字元無效'; ERROR_BAD_NET_NAME: Result := '網路資源名稱無效'; ERROR_BAD_PROFILE: Result := 'The user profile is in an incorrect format.'; ERROR_BAD_PROVIDER: Result := 'The value specified by lpProvider does not match any provider.'; ERROR_BUSY: Result := '網路忙碌中'; ERROR_CANCELLED: Result := '使用者取消網路連線'; ERROR_CANNOT_OPEN_PROFILE: Result := 'The system is unable to open the user profile to process persistent connections.'; ERROR_DEVICE_ALREADY_REMEMBERED: Result := '網路資源已經連線'; ERROR_EXTENDED_ERROR:Result := '網路發生錯誤'; ERROR_INVALID_PASSWORD: Result:='密碼無效'; ERROR_NO_NET_OR_BAD_PATH: Result := '網路元件未啟動'; ERROR_NO_NETWORK: Result := '網路不存在'; end;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。 為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。 在引述到我的文時自然會儘量替各位想辦法,謝謝大家! |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
Coffee
版主 發表:31 回覆:878 積分:561 註冊:2006-11-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |