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

請問如何讓新增的thread對主執行緒下的VCL原件做平行處理

答題得分者是:taishyang
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-01 14:18:11 IP:61.230.xxx.xxx 訂閱
各位先進好, 小弟最近寫了一個自動化設備的人機介面,
且另開了一個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
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-09-01 14:45:53 IP:122.116.xxx.xxx 訂閱
在thread中有控制到VCL時要用Synchronize()同步或是用訊息傳遞的方式同步
不知你是否有做?
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-09-01 16:52:02 IP:61.230.xxx.xxx 訂閱

===================引 用 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);

另外以下是會卡住的地方,
Form1->Label13->Caption = Form1->PtoM(CurrentServo);
Form1->Label11->Caption = Form1->PtoM(CurrentServo);
只要拿掉這兩行 此迴圈就會步受阻礙一切正常
我在網路上看有人說thread不能控制主thread的VCL元件
是這個原因嗎@@





編輯記錄
chang1981 重新編輯於 2009-09-01 16:53:35, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-09-01 17:42:35 IP:122.116.xxx.xxx 訂閱
PtoM(CurrentServo)裡面做了什麼事情?
系統時間:2017-10-18 11:57:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!