• 5854阅读
  • 3回复

两个线程都需要对界面进行刷新应该怎样做? [复制链接]

上一主题 下一主题
离线arotasha
 
只看楼主 倒序阅读 楼主  发表于: 2010-10-29
— 本帖被 XChinux 执行加亮操作(2010-10-31) —
两个线程分别画一幅图到Qwidget上。
但在第一个线程掉用repaint后,第二个线程就会阻塞掉。。
好像是因为槽的原因,直到第一个线程结束,第二个线程才能进入执行repaint
离线dbzhang800

只看该作者 1楼 发表于: 2010-10-29
先贴代码说明一下你的线程时怎么用的吧
离线arotasha
只看该作者 2楼 发表于: 2010-10-29
#pragma omp parallel sections  num_threads(2)
  {
   #pragma omp section
     { 
 
      while(fade <=1){
    for(i = 0; i != srcImage.width();++i)
    {
     
      for(j = 0; j != srcImage.height();++j)
      {
   
      Color = qRgb((qRed(srcArray[j])*(1-fade)+ qRed(dstArray[j])*fade),
         (qGreen(srcArray[j])*(1-fade) + qGreen(dstArray[j])*fade),
         (qBlue(srcArray[j])*(1-fade) + qBlue(dstArray[j])*fade));
      
      rstImage.setPixel(i,j,Color);
      }
     }
   srcImage = rstImage;
  omp_set_lock(&my_lock);

   repaint();
  omp_unset_lock(&my_lock);
   temp1 = fade;
   fade = temp1 +0.01;
     }
     } 
   #pragma omp section
     {
      while(fade2 <=1){
    for( m = 0; m != srcImage.width();++m)
    {
  
     for(k = 0; k != srcImage.height();++k)
      {
   
       Color2 = qRgb((qRed(srcArray[m][k])*fade+ qRed(dstArray[m][k])*(1-fade)),
         (qGreen(srcArray[m][k])*fade + qGreen(dstArray[m][k])*(1-fade)),
          (qBlue(srcArray[m][k])*fade + qBlue(dstArray[m][k])*(1-fade)));
      
       rstImage2.setPixel(m,k,Color2);
     }
    }
   dstImage = rstImage2;
  omp_set_lock(&my_lock);
   repaint();
  omp_unset_lock(&my_lock);
   temp2 = fade2;
   fade2 = temp2 + 0.05;
      }
     }
   

     }


两个线程计算分别要把图片画到屏幕上。但是第一个线程执行repaint后,第二个线程无法执行。。

离线jerry7
只看该作者 3楼 发表于: 2010-10-29
gui只能运行于主线程,可以通过先绘制到pixmap,然后再由主线程拷贝过去
快速回复
限100 字节
 
上一个 下一个