QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3081|回复: 3

Xlib: unexpected async reply (sequence 0x19e59)!

[复制链接]
发表于 2002-12-21 12:57:23 | 显示全部楼层 |阅读模式
RH8.0+KDevelop2.1.4
程序主对话框KMainDlg上有一进度条KProgress1和一个按钮Button1,
按钮slot如下
void KMainDlg::OnOK()
{
  int ret;
  pthread_t p_thread;
  ret = pthread_create( &p_thread, NULL, threadProcess, this );
}

线程实现如下
void* threadProcess( void* data )
{
  KMainDlg* pMain = (KMainDlg*)data;
  int Count=0;
  do
  {
      Count++;
      pMain->KProgress1->setProgress( Count%100 );
      //sleep(1);
  }while( Count<9999 );

  return NULL;
}

程序一运行就在控制台下输出错误,并失去响应
Xlib: unexpected async reply (sequence 0x106e6)!

请问这个错是什么意思,如何改正?
当我加上sleep函数时,为什么进度条不能马上响应,只有用鼠标在窗口上移动或点击,进度条才刷新?
发表于 2002-12-21 15:29:42 | 显示全部楼层
Xlib: unexpected async reply (sequence 0x106e6)!
指的是 Xlib的异步冲突,通常发生在两个线程对 X Server 发出信号而导致的异步
错误。
正常的做法是(大概是这样吧,我忘了函数名了)

[code:1]
main()
{
XThreadInit();
...
}

void*
thread_func(void *arg)
{
XDisplay display;
...
XLockDisplay(display);
... /* 操作 */
XUnlockDisplay(display);
...
}

[/code:1]

但是一般的 XLockDisplay 会导致 XFree86 4.1.x 的 Xft、XRender 功能出现死锁,所以 Motif,Gtk+等都用另外的方法来确保线程安全。

Gtk+采用的方法
[code:1]
main(int argc, char **argv)
{
g_thread_init(NULL);
gdk_threads_init();

gtk_init(&argc, &argv);

gdk_threads_enter();

..... /* 创建线程等操作 */


gtk_main();
gdk_threads_leave();

return 0;
}


void
thread_func(void *arg)
{
...
gdk_threads_enter();
... /* 操作 */
gdk_threads_leave();
...
}


[/code:1]


至于 KDE 或 QT 也应该有这样的功能吧( QThread 、 QMutex、 QSem ...)
回复

使用道具 举报

发表于 2002-12-21 17:05:00 | 显示全部楼层
All GUI classes , OS kernel classes , and networking classes, are not thread-safe.
你为什么不是用QT自己的thread classes.
回复

使用道具 举报

 楼主| 发表于 2002-12-22 00:46:32 | 显示全部楼层
多谢两位指点。

All GUI classes , OS kernel classes , and networking classes, are not thread-safe.

在MFC下的编程习惯看来得改一改了 :-(
QThread、QEvent非常方便易用 :-)
再参考QT提供的线程样例程序,在KDE下编写多线程程序的机制就非常明白了。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-16 16:55 , Processed in 0.044039 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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