LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 944|回复: 11

gtk编程遇到一个让我不知所措的错误

[复制链接]
发表于 2005-3-16 16:34:32 | 显示全部楼层 |阅读模式
我编了一个ftp的客户端,用gtk编的界面。
程序是编的差不多了,可是遇到了一个错误:
当程序连接本地主机,或是其他的网络状况比较好的,连接的人比较少的网站,一点问题都没有,可是如果是连接一些连接人很多的服务器,就会出问题。
我的程序是一个多线程程序,每次连接一些很难连的服务器,就会出现下面的错误:
(gnome_segv:8219): Gtk-WARNING **: Ignoring the separator setting,
而且出现这个错误的时候,我发现连用于网络连接的线程还是照样在运行,只有主线程死掉了
我现在不知道该从哪开始查这个错误
请大家给点意见吧
先谢谢了
 楼主| 发表于 2005-3-16 23:00:59 | 显示全部楼层
我现在发现只要新创建的线程只要被阻塞,主线程就会出现这种错误
请大家帮帮忙啊!我快被这个错误郁闷死了
回复 支持 反对

使用道具 举报

发表于 2005-3-17 09:37:32 | 显示全部楼层
code?!!
回复 支持 反对

使用道具 举报

发表于 2005-3-17 21:16:37 | 显示全部楼层
如果方便的话,放出来大家看一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-18 02:19:32 | 显示全部楼层
Post by Linux_Lyb
如果方便的话,放出来大家看一下吧

因为我的程序有点大,我是怕你们不想看:)
不好意思阿,我编程的习惯不是很好,所以注释不是很多

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-18 02:23:20 | 显示全部楼层
我这个程序的主要的操作都在CFTPShow这个类里面,而且连接ftp是从CFTPShow的StartFTP()开始。
刚才我有试了一下,并不是每次新创建的线程阻塞就会让主线程死掉,而且出现这种情况的几率好像也不是很大
回复 支持 反对

使用道具 举报

发表于 2005-3-18 12:04:57 | 显示全部楼层
每一次和远程服务器通信都新开一个线程?
好像有些线程没有正确的退出,比如TimeLabel会出现负数的情况(是不是多个线程同时操作的结果)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-27 22:08:54 | 显示全部楼层
确实线程在被终止的时候有很大的问题
用pthread_cancel终止一个线程
我观察了一下,有以下情况似乎会出问题:
有两个线程A,B,
线程A执行pthread_cancel(),想终止线程B
调度到线程B执行
线程B被终止
线程A调用pthread_join(),线程A永远被阻塞
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-28 23:23:14 | 显示全部楼层
我的那个程序与下面的模拟程序差不多,不知道为什么cancel的时候老出错
#include <iostream>
using namespace std;
#include <pthread.h>

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

void *thread_run(void *)
{
cout<<"------------thread start"<<endl;
//pthread_cond_signal(&cond);
int state;
while(true){
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE , &state);
cout<<"-----------thread loop"<<endl;
for(int i=0 ; i < 10000 ; i++);
cout<<"----------start to sleep"<<endl;
pthread_setcancelstate(state , &state);
sleep(1);
}
}

int main()
{
for(int i=0 ; i < 1000 ; i++){
pthread_t id;
cout<<"create a thread"<<endl;
pthread_create(&id , NULL , thread_run , NULL);
//cout<<"wait for the new thread to run"<<end;
//pthread_cond_wait(&cond , &mutex);
cout<<"cancel a thread"<<endl;
pthread_cancel(id);
void *reval;
cout<<"wait for a thread to die"<<endl;
pthread_join(id , &reval);
cout<<endl<<endl;
}
}
回复 支持 反对

使用道具 举报

发表于 2005-3-29 13:15:20 | 显示全部楼层
Post by icoming
我的那个程序与下面的模拟程序差不多,不知道为什么cancel的时候老出错
#include <iostream>
using namespace std;
#include <pthread.h>

pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

void *thread_run(void *)
{
cout<<"------------thread start"<<endl;
//pthread_cond_signal(&cond);
int state;
while(true){
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE , &state);
cout<<"-----------thread loop"<<endl;
for(int i=0 ; i < 10000 ; i++);
cout<<"----------start to sleep"<<endl;
pthread_setcancelstate(state , &state);
sleep(1);
}
}

int main()
{
for(int i=0 ; i < 1000 ; i++){
pthread_t id;
cout<<"create a thread"<<endl;
pthread_create(&id , NULL , thread_run , NULL);
//cout<<"wait for the new thread to run"<<end;
//pthread_cond_wait(&cond , &mutex);
cout<<"cancel a thread"<<endl;
pthread_cancel(id);
void *reval;
cout<<"wait for a thread to die"<<endl;
pthread_join(id , &reval);
cout<<endl<<endl;
}
}



线程可能还没创建完,你就试图去退出线程,当然有问题了。改为这样吧
sleep(1);
//pthread_cond_wait(&cond , &mutex);

我也不太懂的,说错别怪
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表