类线程C ++的重载Start Routine函数

时间:2016-12-13 21:33:33

标签: multithreading forms dll c++-cli

在C ++ DLL中使用表单只是为了注意。我认为这很重要,因为我需要它与应用程序具有相同的变量(可能会有所不同或不同)

开始我的表格我必须这样做:

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 个答案:

答案 0 :(得分:1)

我建议您避免使用非托管线程API,并使用托管API。这将允许您使用托管类的实例方法,而不仅仅是静态C ++方法。

MSDN参考:

如果您确实想要使用非托管API,则需要将线程方法设置为静态或全局方法(而不是实例,就像现在一样)。如果它被允许成为托管类的静态方法,我不记得我的头脑。您可能需要将它作为一种全局方法才能使其工作。 (非托管类的静态方法也可以工作,但这并不会给你带来太多帮助。)