2013-05-02 96 views
0

我有多線程的小問題。我使用CreateThread創建自己的線程並在程序啓動時創建它(抱歉,但此時我不能使用VCL線程)。所以我的線程與我的VCL表單一起工作。所有的程序生活第二線程生活。但這裏有一個問題。當VCL表單要終止我的線程時,可以檢查一些表單(類)參數。當然,當我的主窗體已經終止並且一些線程嘗試檢查這種形式的方法時...然後我訪問了違規。從線程訪問

我怎樣才能在我的VCL表格中保證檢查參數?謝謝!

這是我的代碼。

unsigned int WINAPI CheckMutex(LPVOID lpParam) 
{ 
    const int def = 20; 
    int Cnt = def; 
    UnicodeString text; 
    while (1) 
    { 
     if (!UpdFrm || !UpdFrm->Label8 || UpdFrm->MutexTerminate) 
      break; 

首先檢查指向UpdFrm的指針,但VCL表單可以終止,但指向形式仍然活着。所以這就是爲什麼我檢查現有的一些控制。只有在此之後,我檢查MutexTerminate

+0

在窗體的析構函數中,你可以設置'UdpFrm'變量爲NULL。但是這並不能消除'UdpFrm'可能是非-NULL當你第一次檢查它,然後在你可以訪問它的成員之前變爲NULL。爲什麼不在表單被釋放之前終止線程? – 2013-05-04 00:24:42

回答

0

但這裏有一個問題。當VCL表格要終止我的線程可以檢查某種形式(類)參數

不要這樣做,因爲你已經找到了。不要直接從輔助工作線程訪問任何形式的實例變量。

如果您必須與GUI線程VCL組件或TForm後代實例變量進行通信,則只能通過Windows消息進行通信,最好是PostMessaged到窗體。

解決此問題的唯一方法是確保輔助線程在表單實例被釋放之前終止。這將導致你進入一個曲折的小僵局迷宮,所有人都像:(

+0

謝謝,但你能解釋一點點嗎?所以我有一個叫做「UpdFrm」的表單。在構造函數中,我通過「CreateThread」創建了新的線程,所以我必須通過PostMessage向我的所有者線程發送消息?而且,如果我只想檢查可見性,我必須做些什麼?當然,我可以將線程移動到TThread類並使用「Synchronize」方法,但這一個解決我的問題?你能給我一些例子或書籍在哪裏我可以讀這個?謝謝你的建議!! – user922871 2013-05-02 19:50:59

+0

如果你在窗體的構造函數中創建線程,那麼邏輯上你可以終止窗體的析構函數中的線程。這樣,在線程運行時,Form指針永遠不會失效。 – 2013-05-04 00:21:41

+0

僅供參考,您不需要將您的線程切換到'TThread'以使用'Synchronize()'。 'TThread'具有'Synchronize()'的靜態版本,不需要'TThread'對象實例。 – 2013-05-04 00:23:03