c - 我如何才能不卡住单击后处理信息的 GTK 按钮?

标签 c linux ubuntu gtk2

我猜我需要做线程,但在我自学一些不好的做法之前,我想确保我以正确的方式处理这件事。

基本上我有一个“聊天”应用程序,可以告诉它收听或 ping 收件人的 ip 地址:端口(在我当前的例子中只是 127.0.0.1:1300)。当我两次打开我的应用程序时(第一个收听,第二个发送 ping),我选择一个并告诉它收听(这是一个 While 语句,它会不断收听直到收到 ping 消息)和另一个会ping通它。它非常好用!

问题是,当我单击“监听 ping”按钮时,它将进入粘着的“向下”模式并“视觉上”卡住,但它会将 UDP 数据包消息打印到控制台,因此我知道它实际上并未卡住。所以我的问题是如何制作它以便我可以单击“收听”按钮并让它“收听”同时有一个“工作”取消按钮以便用户可以在花费太长时间时取消该过程?

最佳答案

这很可能是因为您使用了同步(阻塞)套接字 IO。您的服务器应用程序很可能在 recv()/read() 上阻塞,这会阻塞线程的执行,直到某些数据到达;然后它处理数据并返回到阻塞状态。因此,您的按钮在按下时由 GTK 呈现。

这个问题基本上有两种通用方法。第一个是线程。但我建议不要在更简单的应用程序中使用它;这种方法通常容易出错,而且实现起来相当复杂。

第二种方法是异步IO。首先,您可以使用 select()/poll() 函数来等待多个 FD 之一发出信号(在诸如“数据已接收”、“数据已发送”等事件上', '已接受连接')。但是在主循环不是立即可用的 GUI 应用程序中(我不确定 GTK,但在许多 GUI 工具包中都是这种情况),这通常是不可能的。在这种情况下,您可以使用通用异步 IO 库(如 boost asio)。使用 GLIB、IIRC,您可以为套接字交互创建 channel (g_io_channel_unix_new()),然后为它们分配回调 (g_io_add_watch()),当发生有趣的事情时将调用回调.

异步 ​​IO 背后的想法非常简单:您要求操作系统做一些事情(发送数据、等待事件),然后您做其他重要的事情(GUI 交互等),直到您请求的事情完成(您有以便能够接收此类事件的通知)。

那么,接下来您可能想研究以下内容:

  • select()/poll()(后者一般比较好用)
  • 提升 asio 库
  • GLIB channel 和异步 IO

关于c - 我如何才能不卡住单击后处理信息的 GTK 按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13907278/

相关文章:

c - 尝试计算字符串中逗号的数量并保存到 int 计数器

c - 用C写入文件

c - 函数中使用的结构指针

代码在 Windows 中有效,但在 Linux 中无效!为什么? 【简单的指针问题】

c++ - 检查是否至少有一个 Wayland session 正在运行

python - 在 Linux [UBUNTU, Python] 中连接 PPTP-VPN

c - 我的多线程应用程序的逻辑?

mysql - Mobilink 与 Linux 上的 MySQL

linux - register_netdevice_notifier回调未提供有效的net_device

ubuntu - Netcat - 如何获得连接时间?