請問如何讓新增的thread對主執行緒下的VCL原件做平行處理 |
答題得分者是:taishyang
|
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
各位先進好, 小弟最近寫了一個自動化設備的人機介面,
且另開了一個thread(假設他叫做AAA_TH)對伺服位置做不間斷的存取 但是現在碰到一個問題 如果我在AAA_TH中,讀取伺服位置(ServoPosition)後, 加上下面這行,直接去把讀到的位置更新到form1上 form1->label->caption = ServoPosition AAA_TH就會被form1上面執行的動作給卡住, 例如form1上面正call到函式"GOGOGO"跑一個伺服前進的迴圈 AAA_TH一定要等GOGOGO跑完才有辦法繼續往下跑 請問有沒有辦法能解決這個問題 讓AAA_TH完全不間斷的一直更新form1上面的元件呢?? 感恩~!!! |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
===================引 用 taishyang 文 章=================== 在thread中有控制到VCL時要用Synchronize()同步或是用訊息傳遞的方式同步 不知你是否有做? [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" #include "Unit5.h" #include "Unit6.h" #include "pci_8132.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Important: Methods and properties of objects in VCL can only be // used in a method called using Synchronize, for example: // // Synchronize(UpdateCaption); // // where UpdateCaption could look like: // // void __fastcall StopMonitor::UpdateCaption() // { // Form1->Caption = "Updated in a thread"; // } //--------------------------------------------------------------------------- extern U16 DOFlag; extern U16 DIFlag; extern AnsiString g_aPICRoot; extern U16 g_UIO_Status; extern bool g_bMonitorMode; extern double CurrentServo; __fastcall StopMonitor::StopMonitor(bool CreateSuspended) : TThread(true) { } //--------------------------------------------------------------------------- void StopMonitor::SetName() { THREADNAME_INFO info; info.dwType = 0x1000; info.szName = "Monitor"; info.dwThreadID = -1; info.dwFlags = 0; __try { RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info ); } __except (EXCEPTION_CONTINUE_EXECUTION) { } } void __fastcall StopMonitor::MonitorIO_Servo() { _8132_get_position(1,&CurrentServo); Form1->Label13->Caption = Form1->PtoM(CurrentServo); Form1->Label11->Caption = Form1->PtoM(CurrentServo); _8132_DO(1,DOFlag);//點位輸出 _8132_DI(1,&DIFlag);//點位輸入 //**************************** U16 io_status; AnsiString Path = g_aPICRoot; if(g_bMonitorMode) { _8132_get_io_status(1,&io_status); if(g_UIO_Status!=io_status) { g_UIO_Status = io_status; unsigned char A; A = io_status; if(A&2048)//INP Form5->Image12->Picture->LoadFromFil(g_aPICRoot "\\green.bmp"); else Form5->Image12->Picture->LoadFromFile(g_aPICRoot "\\red.bmp"); } //**************************** }//g_bMonitorMode } //--------------------------------------------------------------------------- void __fastcall StopMonitor::Execute() //檢測所有IO之執行緒 { SetName(); //---- Place thread code here ---- while(!Terminated) { Synchronize(MonitorIO_Servo); Sleep(100); } } //---------------------------------------------------------------------------[/code] 感謝版大回覆~ 以上是我thread的程式碼 有做Synchronize(MonitorIO_Servo); 只要拿掉這兩行 此迴圈就會步受阻礙一切正常 我在網路上看有人說thread不能控制主thread的VCL元件 是這個原因嗎@@
編輯記錄
chang1981 重新編輯於 2009-09-01 16:53:35, 註解 無‧
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |