【发布时间】:2020-08-26 22:48:34
【问题描述】:
我被分配创建一个程序来处理三个 WINAPI 线程并反映那些正在进行的条的工作流。我决定将 Qt Widgets 用于这些目的。我使用CREATE_SUSPENDED 创建标志创建处于挂起状态的线程,然后在单击按钮时使用ResumeThread 函数恢复它。当我单击它时,程序会因未处理的 win32 异常而崩溃。为什么会发生这种情况?
我的“创建”按钮点击槽
void MainWindow::on_pb_create_clicked()
{
hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc1, NULL, CREATE_SUSPENDED, &thID[0]);
hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc2, NULL, CREATE_SUSPENDED, &thID[1]);
hThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadFunc3, NULL, CREATE_SUSPENDED, &thID[2]);
threadsCreated = true;
}
我的“开始”按钮点击槽
void MainWindow::on_pb_start_clicked()
{
if(threadsCreated)
{
for(int i = 0; i = 2; i++)
{
ResumeThread(hThread[i]);
}
}
else
{
QMessageBox msg;
msg.setWindowTitle("Error");
msg.setText("Threads are not created");
msg.exec();
}
}
我的线程函数
DWORD WINAPI MainWindow::ThreadFunc1(LPVOID lpParams)
{
for(int i = 0; i < 100; i++)
{
ui->progressBar->setValue(i);
sleep(500);
}
return 0;
}
其他2个线程功能相同,只是进度条不同。
【问题讨论】:
-
调试器告诉你崩溃发生在哪里?此外,您的
for循环中有错字。 -
MainWindow::ThreadFunc1是static的MainWindow的函数吗? -
您正在从多个线程访问相同的变量而没有任何同步(互斥锁等)。这是未定义的行为。
-
@JonathanPotter 由于分段错误导致的崩溃发生在该行的第一个线程函数中,其中设置了进度条值。此外,它在第三个函数中,直到我修正了一个错字。
-
如果你必须显式地将函数指针转换为
(LPTHREAD_START_ROUTINE),这就是问题的根源。删除 CreateThread 中的那些强制转换并显式修复线程入口点的函数签名。
标签: c++ multithreading qt winapi