Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
用 DELPHI 在Windows 3.1一個訊息處理程序中,對一個驅動程式下命令,(例如 comm.drv的 API Function)然後等待這個驅動程式回應動作完畢(這個訊息是由 Windows 3.1 作業環境來提供),然後繼續執行下去,(有點把多工變成單工的味道),請問各位前輩該如何解決這種問題呢?
我目前的方法比較複雜一點, 謹提供一個實驗的例子來模擬這個問題, 請您參考, 過程如下:
![]() |
1. File | New Project 開一個新的專案 |
![]() |
2. 在 Form1 中安排二個 TButton, 其中 Button2 模擬成呼叫其他程式或Dll的部分, Button1則是那個 被呼叫的程式(DLL), 它會發出一個Windows訊息 |
![]() |
3. With Button1:
set Caption = 'Send Message' OnClick Event 撰寫程式: (* ----------- *) procedure TForm1.Button1Click(Sender: TObject); begin (* 請想像是該 DLL 發出一個訊息 *) SendMessage(Handle, wm_MyTestMessage, 1, 0); end; |
![]() |
4. With Button2:
Set Caption = 'Waiting Test' OnClick Event 撰寫程式: procedure TForm1.Button2Click(Sender: TObject); begin iTestMake := 0; (* Your code to Call the other Win-program *) (* 在沒有得到反應的訊息前, 執行下列迴圈 *) (* 事件程式暫時不往下執行 *) while iTestMake = 0 do Application.ProcessMessages; MessageDlg('Test Done', mtInformation, [mbOK], 0); end; |
![]() |
5. 在 Unit1 的 interface section 的 uses 與 Type 中間加入:
const wm_MyTestMessage = wm_User + 1; (* 我們自訂的一個訊息, 模擬成另 DLL 發出的訊息 *) |
![]() |
6. 在 TForm1 的 Private 部分宣告一個 integer 變數, like:
private { Private declarations } (* 我們用這個變數判斷 DLL 是不是有了回音 *) iTestMake: integer; |
![]() |
7. 接著撰寫回應 wm_MyTestMessage 的訊息處理程序
在 TForm1 的 protected 部分加入下列宣告 protected (* 訊息處理函式 *) procedure AnswerMyMessage(var Message: TMessage); message wm_MyTestMessage; 在 implementation section 中加入下列程式: (* 回應 wm_MyTestMessage 的訊息處理程序 *) procedure TForm1.AnswerMyMessage(var Message: TMessage); begin if Message.wParam = 1 then iTestMake := 1 else iTestMake := -1; end; |
![]() |
8. 執行這個程式, 先點一下 'Waiting Test', 再點一下'Send Message', 在您沒有點
'Send Message' 之前不會執行到這一列程式:
MessageDlg('Test Done', mtInformation, [mbOK], 0); |
不過, 這樣子還要考慮萬一這個被我們呼叫的 DLL 一直沒有發出回應時: 如何處理, 最簡單的方式是判斷時間, 例如半分鐘時仍沒有回音時, 應該結束掉迴圈, 這部分我就暫時不模擬了
希望以上的例子能幫得上您的忙
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |