线程 C++ 上的用户 I/O
Posted
技术标签:
【中文标题】线程 C++ 上的用户 I/O【英文标题】:User I/O on threads C++ 【发布时间】:2015-05-18 18:44:01 【问题描述】:我这里有一些代码,其中包含一个窗口类(使用 Nana C++)和一些网络线程。但是,我似乎无法以任何方式向用户输出。我尝试附加到文本框,使用消息框,打印到控制台,但它不会显示。这是 Nana 还是 Boost.Thread 的问题?
如果 Boost.Thread 有问题,我可以切换到 std::thread,但我认为它不会起作用。
void thread()//Let's say this function is started on a thread and the window is started on main
append(L"append test");
MsgBox(L"msgbox test"):
【问题讨论】:
这有帮助吗***.com/questions/8735830/… 在某些平台上,您只能从主线程绘制到 GUI。不过,使用 stdio 应该始终有效。 @west 所以我继续回答这个问题并找到了关于 Nana 的答案。您是在建议我从 Boost.Thread 更改为 nana::thread 或 nana::thread_pool?听起来很有趣,我会尝试一下。 不,我的想法是您需要通过这些线程进行通信,并且您需要某种方式使用消息传递或其他 IPC 机制进行通信,您可以创建消息框,但如果窗口未打开无法显示的同一线程。 【参考方案1】:有一个 Nana 演示说明如何在其他线程中附加文本。
#include <nana/gui.hpp>
#include <nana/gui/widgets/textbox.hpp>
#include <nana/gui/widgets/button.hpp>
#include <mutex>
#include <condition_variable>
#include <thread>
int main()
using namespace nana;
form fm(API::make_center(300, 250));
textbox txt(fm, rectangle(10, 10, 280, 190));
button btn(fm, rectangle(10, 220, 200, 20));
btn.caption("append texts in other thread");
std::mutex mutex;
std::condition_variable condvar;
volatile bool running = true;
std::thread thrd([&]
while(running)
std::unique_lock<std::mutex> lock(mutex);
condvar.wait(lock);
txt.append(L"append a new line\n", false);
msgbox mb(L"hello");
mb<<L"This is a demo";
mb.show();
);
btn.events().click([&]
std::lock_guard<std::mutex> lock(mutex);
condvar.notify_one();
);
fm.events().unload([&]
running = false;
std::lock_guard<std::mutex> lock(mutex);
condvar.notify_one();
);
fm.show();
exec();
thrd.join();
此演示使用 Nana C++ Library 1.0.2 创建,可在 Windows/Linux 上正常运行
【讨论】:
IMO,不使用 bool 值来检查线程是否运行不好?由于volatile
的定义并没有很好地标准化,所以这不是真正可移植的。以上是关于线程 C++ 上的用户 I/O的主要内容,如果未能解决你的问题,请参考以下文章