Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 启动Windows GUI应用程序时的后台作业_C++_User Interface_Winapi - Fatal编程技术网

C++ 启动Windows GUI应用程序时的后台作业

C++ 启动Windows GUI应用程序时的后台作业,c++,user-interface,winapi,C++,User Interface,Winapi,当我的Win32应用程序启动时,应执行LoadDB(),至少需要10或20秒。在哪里执行LoadDB(),作为后台加载任务,以防止GUI窗口无响应? 是否可以这样做,但不必创建单独的线程?(这看起来很复杂,我想避免) 注意:如果我在主消息循环中执行此操作: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { cas

当我的Win32应用程序启动时,应执行
LoadDB()
,至少需要10或20秒。在哪里执行
LoadDB()
,作为后台加载任务,以防止GUI窗口无响应?

是否可以这样做,但不必创建单独的
线程
?(这看起来很复杂,我想避免)


注意:如果我在主消息循环中执行此操作:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CREATE:
            LoadDB();
            ...

GUI将没有响应。

创建线程实际上并不像最初看起来那么复杂

当您需要支持线程之间的交互时,事情可能会相当复杂——但在本例中,您所需要的只是启动一些东西,然后得到一个完成的通知。就这样

因此,您要做的是编写一个调用loadDB()的小函数,然后(例如)调用
PostMessage
,让应用程序的其余部分知道DB已加载并可以使用


没有比这更重要的了。说真的,它并不复杂,复杂。

“这看起来很复杂”——做复杂的事情很复杂。产生一个线程并把你的程序放在那里。@ NeilButterworth,如果需要的话,我可以做。但是我想说:“没有其他的方法吗?”处理现代C++中的线程实际上是很容易的,但看起来你正在编写一个C程序,你恰巧是用C++编译器编译的。那么我可以使用这个@ NeilButterworth。您将从何处开始此操作/线程?WM_创建/其他地方?谢谢@JerryCoffin。加载完成后,Thread2在
LoadDB()
期间加载的
std::vector
是否可以被主线程访问?@Basj:如果您希望它可以访问,您需要确保它可以访问。如果(例如)它是一个全局变量,那么可以访问。如果它是动态分配的,您需要将其地址传递回代码的其余部分,让他们知道它所在的位置。但最终,所有线程都共享相同的地址空间,因此在一个线程中执行的操作可以让其他线程非常容易地看到。