C++ 启动Windows GUI应用程序时的后台作业
当我的Win32应用程序启动时,应执行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
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:如果您希望它可以访问,您需要确保它可以访问。如果(例如)它是一个全局变量,那么可以访问。如果它是动态分配的,您需要将其地址传递回代码的其余部分,让他们知道它所在的位置。但最终,所有线程都共享相同的地址空间,因此在一个线程中执行的操作可以让其他线程非常容易地看到。