【发布时间】:2019-07-01 16:07:22
【问题描述】:
我正在研究多线程。我将 Win32Api 用于 CreateThread。 我有 char 数组,其中包含 5 个驱动器号。我需要将这些驱动器一个一个地MessageBox。
这是我的代码:
DWORD WINAPI Fun(LPVOID param)
{
const char* str = (const char*)param;
MessageBox(NULL, str, "hello", MB_OK | MB_ICONQUESTION);
return 0;
}
void StartWork()
{
int n, d, b = 0;
char dd;
DWORD dr = GetLogicalDrives();
HANDLE threads[26];
for (int i = 0; i < 26; i++)
{
n = ((dr >> i) & 1);
if (n == 1)
{
dd = char(65 + i);
std::string text(1, dd);
d = GetDriveType((text + ":\\").c_str());
if (d == DRIVE_REMOVABLE || d == DRIVE_FIXED || d == DRIVE_REMOTE)
{
threads[b] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Evil, (LPVOID)text.c_str(), 0, NULL);
b += 1;
}
}
}
WaitForMultipleObjects(b, threads, TRUE, 1000);
}
输出不是我想要的。我刚刚收到最后一个磁盘号(我有 3 个磁盘 - C、D、E,我的输出是 msgbox "E" 的 3 倍)
【问题讨论】:
-
您正在向 CreateThread 传递一个指向字符串文本内部缓冲区的指针。文本超出范围时会被销毁。其次std::string是c++,为什么这个问题标记为C?
-
进一步,如果你“需要一个个的MessageBox这些驱动器”,为什么首先需要并发?
-
@veter0 正如 CuriouslyRecurringThoughts 所指出的,您需要正确使用缓冲区。您可以动态分配,将其发送到线程函数,然后从那里释放它。提出您的问题,您真正拥有什么类型的驱动器?确保它在您提供的 3 种类型中,而不是 DRIVE_CDROM 或其他类型。
-
使用
std::thread摆脱所有这些强制转换,让自己从一些评论者建议的手动内存管理中解脱出来。CreateThread()并不真正适合现代 C++ 程序。使用std::thread,您只需按值传递std::string即可。 -
int n, d, b,char dd,int i。你不觉得char的变量名有点太,呃,冗长吗?无论如何,我们不知道您的问题是什么,因为我们看不到Evil。
标签: c++ multithreading winapi createthread