撰寫執行緒函式,在Form中操作Label1數數。
DWORD WINAPI ThreadFunc(LPVOID lpParameter)
{
int i;
String s;
for(i=0;i<=100000;i++)
{
s=IntToStr(i);
Form1->Label1->Caption = s;
}
}
建立一個按鈕,啟動執行緒
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD threadID;
hHandle = (int)CreateThread(NULL,
0,
ThreadFunc,
(void*)this,
0,
&threadID);
}
點擊按鈕,運行報錯,“canvas does not allow drawing”,自己研究很長時間沒有結果,望大神幫忙~
uj5u.com熱心網友回復:
初步看來, 是非VCL執行緒操作VCL物件的原因。按照你的代碼來看, 沒有使用 TThread 物件,而是直接使用 API 創建的執行緒。
這個時候,應該首先定義一個自定義訊息,然后, 在執行緒中, SendMessage(自定義訊息,i) (偽代碼)
然后,在 Form1 中處理自定義訊息, 顯示訊息帶來的 i 值到 Label1->Caption
uj5u.com熱心網友回復:
如果使用 TThread 物件, 則使用 Synchronize 方法即可// 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 asasdf::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/101636.html
上一篇:cp-abe屬性加密程式編碼
