全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2001
推到 Plurk!
推到 Facebook!

在thread 中開啟 Form

答題得分者是:RaynorPao
dieWelt
一般會員


發表:2
回覆:2
積分:0
註冊:2007-11-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-24 01:57:05 IP:61.229.xxx.xxx 訂閱
想請教各位高手,

我現在有三個視窗Form1, Form2, Form3.
Form1是main form,我在Form1 的建構子中用 _beginthread( IntThread, 0, 0) 產生了一個thread;
IntThread中,用WaitForSingleObject()來即時偵測由實體感測器(近接開關之類的)傳回來的異常訊息。
Form3則是用來顯示異常訊息用。
我希望不論在使用Form1或Form2時,如果偵測到感測器有訊號進來,
馬上能show出Form3,而Form3關閉之後,又能回到原先的視窗(Form1 or Form2)。

我原本在IntThread中,直接讓 Form3->Show();
它能正常執行,但Form3關掉之後,都會發生錯誤(當掉),沒有辦法正常的回到原來的視窗。
請問在thread中,該如何做才能正常運作呢?

對thread的概念很不清楚,@_@a 感謝各位。
附上 IntThread() 程式碼

[code cpp]
void IntThread(void* pArg)
{
int err = 0;
while(true) {
if( WaitForSingleObject(hEvent1[0], INFINITE) == WAIT_OBJECT_0) {
unsigned short COSLData ;
err = DIO_GetCOSLatchData(0, &COSLData); // 取得感測器狀態

if( COSLData != 0){ // button interrupt.
Form3->InterrputError( COSLData );
Form3->Show();
}
}
}/* End of while-loop*/
_endthread();
}

[/code]
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-24 16:35:04 IP:210.208.xxx.xxx 未訂閱
(1)絕大部分的 VCL 元件,包括 TForm 在內,都不是 Thread-Safe 的元件,不建議直接在 MainThread 以外的 Thread 裡面操作(因為結果往往無法預期)
(2)依據你的需求,可以利用 Timer 元件來達成,只要把 Interval 設小一點就可以了(例如: 100 or 10 ms)

相關參考文章:
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=49776
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
編輯記錄
RaynorPao 重新編輯於 2008-07-24 16:36:37, 註解 無‧
dieWelt
一般會員


發表:2
回覆:2
積分:0
註冊:2007-11-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-24 18:17:42 IP:220.139.xxx.xxx 訂閱
好的,原來如此,

那看來能用的方法只在Form1, Form2中設置一個boolean,
然後讓IntThread去更改這些值。
再用Form1, Form2裡頭的Timer去檢查,
如果是True再立刻跳去Form3

感謝!!

我對Thread了解太少。@@a
系統時間:2017-12-14 4:23:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!