【发布时间】:2013-05-15 11:16:10
【问题描述】:
我写了一个应用程序。有一个名为 APP 的类,有窗口句柄,里面有消息循环,以及所有这些东西。
它旨在“运行”这个类的一些对象,每个对象都有自己的窗口,基于标准窗口所需的一组变量。
消息循环允许公共使用,它由 RunMessageLoop 方法运行。 int nCmdShow - 当然,它是用来告诉如何显示一个窗口的。
现在,当我创建一些像这样的对象时:
vector <APP *> App;
for (int i=0; i<3; i++)
{
App.push_back(&APP(nCmdShow))
App[i]->RunMessageLoop();
}
程序在开始另一个消息循环之前等待每个消息循环结束。
我想办法做到这一点:
vector <APP *> App;
for (int i=0; i<3; i++)
{
App.push_back(&APP(nCmdShow))
}
for (int i=0; i<3; i++)
{
App[i]->RunMessageLoop();
}
当我知道我想在启动时运行多少个窗口时,似乎没问题。
但我不知道如何动态创建新窗口,完全独立于其他窗口。它应该调用消息循环并立即返回 WinMain() 而不结束消息循环。
我想到了多线程应用程序,每个线程对应一个 APP 类的一个实例。但是不知道如何构建多线程应用程序。
对可能的解决方案有什么想法吗?
【问题讨论】:
-
您的代码有未定义的行为。当您这样做时:
App.push_back(&APP(nCmdShow))您正在存储指向立即销毁的临时对象的指针。 -
嗯,在我看来它没有被破坏,因为我可以看到窗口,并且它正在响应消息。如果编码不正确,请给我一些建议,如果可以的话。
-
@bercik “未定义的行为”可能似乎在起作用,并在以后由于某种原因暴露其未定义性时困扰您数周。我很惊讶
&APP(nCmdShow)甚至可以编译。你应该在那里使用new,而不是&。 -
我只知道指针使用的基础;我不熟悉operator new。它在代码中看起来如何?
-
当你创建一个对象而不使用
new,你在堆栈上创建它。因此,一旦您在其中创建APP的函数返回,APP将被销毁,从而使存储在向量中的指向APP的指针无效。使用App.push_back(new APP(nCmdShow)),APP将存储在动态内存中,防止其被破坏,然后指针将有效。顺便说一句,无论您是否对它们进行了无效指针,这些窗口仍然会出现。
标签: c++ visual-studio object instance