gpt4 book ai didi

c - 在 while(1) 循环中阻塞的线程内处理 postthreadmessage() 或使用 "Event Driven Sockets"

转载 作者:太空宇宙 更新时间:2023-11-04 06:34:31 24 4
gpt4 key购买 nike

我有一个单服务器多客户端 udp 应用程序。有一个线程(thread#1)和一个套接字(socket#1)连续接收来自 client#1 的数据。这个接收线程的任务是在它的套接字上不断地接收数据。

我在服务器应用程序 GUI 上有一个按钮,上面写着“将数据发送到客户端#1”。当按下这个按钮时,我希望我的接收线程暂停接收并在 socket#1 上发送一些数据,当发送数据时,恢复连续接收。

如何做到这一点?如果我什至在按下按钮时 postthreadmessage(),接收线程不会检查这些发布的消息,因为它总是在 while 循环中接收消息。它如何检查与按下的按钮对应的已发布消息?

编辑:另一个建议

如果我让我的套接字“事件驱动”怎么办?即,每当套接字上有一些数据可供读取时,就会生成 FD_READ 事件,我可以在套接字上读取,每当我想在套接字上写入一些数据时,我都会生成一个事件 FD_WanttoWrite,然后将数据写入套接字。类似的东西可能吗?

(我知道 FD_READ 但当我想在 Socket 上写东西时我不确定 FD_WanttoWrite)

最佳答案

您真的不需要暂停阅读线程。只需使用相同的套接字(或什至不同的套接字,因为 UDP 是无连接的)立即从按钮点击处理程序内部发送/到()数据。

暂停阅读线程的唯一真正原因是发送的数据收到您不希望接收线程看到的响应。如果是这种情况,那么您有几个选择:

  1. 让接收线程将任何响应传递给按钮单击处理程序,以便在需要时进行处理。

  2. 向接收线程添加一个标志,告诉它停止从套接字读取数据。让按钮在发送时设置标志,然后在完成时清除标志。让接收线程的循环使用 select() 并设置一个小超时,这样循环的每次迭代都可以检查标志并在设置标志时跳过读取。

  3. 切换到事件驱动套接字并在接收线程中使用消息循环,就像您建议的那样。然后你可以给线程传递消息,比如一个消息告诉它当 FD_READ 消息到达时跳过阅读,另一个消息要恢复阅读。如果您希望线程代表按钮调用 send/to(),您还可以为此发送一条消息,并且在发送过程中任何读取都将被隐式阻止。

关于c - 在 while(1) 循环中阻塞的线程内处理 postthreadmessage() 或使用 "Event Driven Sockets",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16541335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com