2016-12-13 128 views
0

在C++ DLL中使用表單只是爲了說明。我想象的那樣,我需要它有相同的變量作爲應用程序有這將是重要的(這可能會或可能不會有所不同)已重載的啓動類線程的例程函數C++

開始我的表單我必須這樣做:

Form1^ThisForm = gcnew Form1; 
Application::Run(ThisForm); 

這是基本沒有困難的。我的表單在使用時可以正常工作。現在我想通過Form1(ThisForm)創建一個線程。他們在這裏定義:

public: 
    VOID WINAPI MainThread2(); 

而且它所做的就是設置標籤內這對當前時間:

VOID Form1::MainThread2() 
{ 
while (true) 
{ 
    Beep(400, 100); 
    time_t CurrentTime = time(0); 
    struct tm* TimeStruct = localtime(&CurrentTime); 
    string str = to_string(TimeStruct->tm_hour) + ":" + to_string(TimeStruct->tm_min) + ":" + to_string(TimeStruct->tm_sec); 
    String^ timestring = gcnew String(str.c_str()); 

    this->label1->Text = "hello"; 
} 

}

但很明顯我不能創建這個線程:

CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThisForm->MainThread2, NULL, NULL, NULL); 

由於這個錯誤:

error C2440: 'type cast': cannot convert from 'overloaded-function' to 'LPTHREAD_START_ROUTINE' 

我怎麼會設法通過THISFORM

回答

1

我建議您避免非託管線程API和使用管理的人啓動一個線程。這將允許您使用託管類的實例方法,而不僅僅是靜態C++方法。

MSDN參考:


如果你確實想使用的非託管的API,你需要讓你的線程方法的靜態或全局方法(不是實例,就像你現在這樣)。如果允許它成爲託管類的靜態方法,我不記得我的頭頂;你可能需要讓它成爲一種全球性的方法來完成這項工作。 (非託管類的靜態方法也將工作,但是,這並不買你的了。)

+0

我試圖做到這一點: 線程^ newThread ----但在更新任何標籤的等沒有按在線程內不工作 – Reece

+1

這不會通過切換到用於啓動線程的非託管API來改變。有幾種從UI線程以外的線程更新WinForms API的技術,我相信你可以通過搜索StackOverflow找到它們。 –