怎样强制停止一个QT线程

fight_flight 2010-09-09 10:23:25
这个线程里运行的是一个无限循环的任务,不人为停止自己不会停止,怎样强制让其停止。
本人初学qt,没有找到可以使其停止的函数。
...全文
2557 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fight_flight 2010-09-10
  • 打赏
  • 举报
回复
这是线程运行的内容


void SocketServer::run(){
if (listen(servSock, MAXPENDING) < 0){
cout<<"listen() failed";
exit(3);
}
for (;;) { // Run forever
struct sockaddr_in clntAddr;
socklen_t clntAddrLen = sizeof(clntAddr);
int clntSock= accept(servSock, (struct sockaddr *) &clntAddr, &clntAddrLen);
if (clntSock < 0){
cout<<"accept() failed";
exit(4);
}
char clntName[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName,
sizeof(clntName)) != NULL)
printf("Handling client %s/%d\n", clntName, ntohs(clntAddr.sin_port));
else
puts("Unable to get client address");
ThreadArgs *threadArgs=new ThreadArgs();
threadArgs->clntSock=clntSock;
pthread_t threadID;

int returnValue=pthread_create(&threadID,NULL,ThreadMain,threadArgs);
if(returnValue!=0){
cout<<"pthread_create() failed!!";
exit(5);
}
}
}



有些其他函数的代码没有贴出,作用是接受客户端的连接,然后接受客户端传来的文件,传文件又用linux的pthread_create创建线程。
gaowenboms 2010-09-10
  • 打赏
  • 举报
回复
可以用deletelater()槽,这样比较安全吧,terminate不是说尽量不要用吗
fight_flight 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qqyanchong 的回复:]

楼主可以在for循环中加入一个布尔变量(该线程类的一个私有变量),初始化为true当想停止线程时,写一个public函数将其置为false这样线程就可以退出了。
[/Quote]

这个函数我试过,但不论加在accept之前或之后都不太好使,因该是listen函数的问题,因为已经监听,即使退出线程也可以接受信客户 不好解决亚
yanchong 2010-09-10
  • 打赏
  • 举报
回复
楼主可以在for循环中加入一个布尔变量(该线程类的一个私有变量),初始化为true当想停止线程时,写一个public函数将其置为false这样线程就可以退出了。
fight_flight 2010-09-10
  • 打赏
  • 举报
回复
我是直接调用线程类的terminate函数,整个进程都退出了,另外调用deletelater函数没有效果,客户段依然可以连接并发送文件。 是不是我使用这两个函数的方法不对 求高手指点
lefttime 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wocaoqwer 的回复:]

引用 1 楼 lefttime 的回复:

调用terminate()~``; 或者终止线程所在的进程也可!
最好是在循环条件中加个终止变量, 需要终止时改变变量的值来结束比较合适 :)


这几个方法都不好使呀,用terminate整个进程都结束了,这个进程不能结束
我是在这个线程里使用了socket 的accept循环来作服务端,希望结束线程来不让其他的客户机连接服务端。
[/Quote]
1. "...用terminate整个进程都结束了..." 你是如何调用terminate的?!
2. 能写出个大概的模型吗? 光从文字描述来看, 将socket的accept作为循环能进入无限循环好像不是很理解?
fight_flight 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lefttime 的回复:]

调用terminate()~``; 或者终止线程所在的进程也可!
最好是在循环条件中加个终止变量, 需要终止时改变变量的值来结束比较合适 :)
[/Quote]

这几个方法都不好使呀,用terminate整个进程都结束了,这个进程不能结束
我是在这个线程里使用了socket 的accept循环来作服务端,希望结束线程来不让其他的客户机连接服务端。
lefttime 2010-09-09
  • 打赏
  • 举报
回复
调用terminate()~``; 或者终止线程所在的进程也可!
最好是在循环条件中加个终止变量, 需要终止时改变变量的值来结束比较合适 :)

16,240

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧