线程 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的主要内容,如果未能解决你的问题,请参考以下文章

linux上的缓冲异步文件I/O

网络I/O模型

4-15 OS(线程,用户态,内核态,页) 数据库(原子性,日志) JAVA(I/O)

在 C++ 中实现高效的多线程文件 I/O

哪些因素应该决定我的 C++ 网络服务器上的线程数?

非阻塞I/O事件驱动