0

我需要运行例如:

ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);

作为新线程,但我不知道如何。我试过这个:

HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);
WaitForSingleObject( hThread, INFINITE );

但显然它是错误的,无法编译。我该怎么做?

4

1 回答 1

3

你所尝试的显然是错误的,但问题是你是否理解它的问题所在。_beginthread指向函数的指针(具有特定的原型和调用约定)作为其第一个参数。

当你写

HANDLE hThread = (HANDLE) _beginthread(ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE), 0, NULL);

您正在尝试传递调用(在当前线程中)_beginthread结果,它是一个,而期望一个(指向一个函数的指针并返回一个参数)。ShellExecuteHINSTANCE_beginthreadvoid( __cdecl *)( void * )__cdeclvoid*void

不仅您的代码不起作用,因为您试图将HINSTANCE函数传递给预期指针的位置,而且没有任何意义。你读过_beginthread文档吗?那里有例子。复数。

你要写的是:

HANDLE hThread = (HANDLE) _beginthread(ThreadFunc, 0, NULL);

给定:

void __cdecl ThreadFunc(void*) {
    ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
}

或者,以更紧凑且易于阅读的形式:

HANDLE hThread = (HANDLE)
                 _beginthread([](void*) {
                     ShellExecute(NULL, "open", "program.exe", NULL, NULL, SW_HIDE);
                 },
                 0, NULL);

除非你正在做一些超出我们在这里看到的事情,否则大卫的评论可能是正确的,你应该使用std::threador std::async

另请注意,将_beginthread(int 与_beginthreadexor的结果形成对比CreateThread) 的结果视为不安全,因为它可能无效,如文档中所述。不仅如此,而且_beginthread' 的返回值并不是真正的 a HANDLE(它是一个句柄的痛处,但不是一个HANDLE!),所以你不能WaitForSingleObject在它上面:

_beginthreadex函数使您可以更好地控制线程的创建_beginthread方式。_endthreadex功能也更加灵活。例如_beginthreadex,您可以使用安全信息,设置线程的初始状态(运行或挂起),并获取新创建线程的线程标识符。您还可以使用_beginthreadex同步 API_beginthread返回的线程句柄,而.

使用起来_beginthreadex_beginthread. 如果由 生成的线程_beginthread快速退出,返回给调用者的句柄_beginthread可能无效或指向另一个线程。但是,返回的句柄_beginthreadex必须由 的调用者关闭,因此如果没有返回错误_beginthreadex,则可以保证它是有效的句柄。_beginthreadex

由于这个线程只调用一个函数并退出,它几乎最大化了这个句柄无效的机会。即使是这样,您仍然无法将其用于WaitForSingleObject.

于 2017-01-18T21:53:49.787 回答