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

TThread 和 SpeedButton 所出現錯誤訊息

缺席
e_snare
一般會員


發表:26
回覆:35
積分:12
註冊:2004-03-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-03 12:03:35 IP:211.74.xxx.xxx 未訂閱
大家好 我用TThread來處理一段程式 用SpeedButton來開關COM PORT    當我的SpeedButton不是壓下時我的程式碼如下    2.MyThread->Terminate();   CloseHandle(我HANDLE的變數名稱);    當我壓下時做任何動作都正常,包括直接關閉程式也很正常! 但當我壓下再取消後,然後關閉程式就會出現 Project xxx.exe raised exception class EExternalException with message 'External exception C0000008. Process stopped. Use Step or Run to continue. 其實如果不是在撰寫模式下,也就是直接從檔案總管裡找出來執行是不會有這個 錯誤訊息的!    如果我在第2點只加MyThread->Terminate();不加CloseHandle(var);就不會有錯誤訊息,問題是這樣我再壓下SpeedButton時就會無法開啟COM PORT,就無法執行程式! 如果只加CloseHandle(var);不加MyThread->Terminate();會有相同錯誤!    其實兩個都加有時還會多一個錯誤訊息,什麼Thread Error:控制碼無效! 當我壓下正常運作然後取消壓下再次壓下時會出現!! 不知是否有人知道發生了什麼事? 對了,SpeedButton壓下時我有MyThread->Resume(); 發表人 - e_snare 於 2004/07/03 12:25:46
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-04 00:02:56 IP:211.76.xxx.xxx 未訂閱
e_snare你好:     在執行完MyThread->Terminate();這一行的時候,Thread並不會馬上停止,Terminate()做的事情只是把變數Terminated設為True。(這時Thread還在進行)        因此,你之後馬上執行CloseHandle就會出問題(因為Thread還沒停,只要有用到這個Handle就會掛了)        修改的重點如下:    1.Terminate()後加上WaitFor(),就可以等待TThread真正的結束。但是Thread的寫法一定要注意常常檢查變數Terminated,一但發現Terminated變成True就要趕快結束。    2.把CloseHandle寫在Thread的destructor。不過可要記得設FreeOnTerminate 為True。        試試看能不能解決問題,不能的話再來看是那兒出問題 站上之前有不少版大討論過這類的文章,也可以看看。
e_snare
一般會員


發表:26
回覆:35
積分:12
註冊:2004-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-04 12:43:06 IP:211.74.xxx.xxx 未訂閱
謝謝pwipwi熱心的回覆 我想問題就和你所說的一樣, 不過昨天程式改了很多,所以也說不出是怎麼解決的!因我做了大改! 但現在沒這問題了,結論就是我對於TThread及程式寫法還不熟! 要和大家多學習,謝謝! 發表人 -
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-05 22:40:15 IP:218.247.xxx.xxx 未訂閱
我也寫過COM PORT(Rs232)程式也用Thread處理資料運用交換機上
請試試
XXX.h
public:                // User declarations
  ReceiveData *receiveData; // Function of Thread     XXX.Cpp
按下停止的Button 
receiveData->Suspend();
    delete receiveData;  // 停止Thread
按下起用的Button 
try
{
   receiveData = new ReceiveData(false);
   receiveData->Resume(); // 啟用Thread
}
catch(...)
{
   執行不了訊息;
}
請參考
Andy Chang
------
Andy Chang
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-05 22:48:39 IP:218.247.xxx.xxx 未訂閱
對不起,根據經驗法則,Rs232暫停是很重要的,e_snare不知你可有注意 ,請參考 ReceiveData.Cpp
void __fastcall ReceiveData::Execute()
{
  //---- Place thread code here ----
  //Terminate();
  while(!Terminated)
  {
    Synchronize(fsReceive);  // 處理Rs232資料
    Sleep(300);              // 暫停0.3秒並不需要太精確
  }
}
Andy Chang
------
Andy Chang
系統時間:2024-05-15 1:32:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!