在同一进程中发出另一个线程的信号

时间:2015-07-06 05:34:42

标签: c++ multithreading mfc signals

我有一个处理某些数据的应用程序,并在UI中显示。

最初,我只有一个线程,即主要进程,即完成工作,即检索数据以进行处理,处理数据,然后更新UI。数据驻留在另一台服务器上。

但是,对应用程序的要求发生了变化,并且必须从服务器检索并处理的数据比以前想象的要多得多。这会产生性能问题,因为必须检索,处理数据,然后UI必须确定应该放在哪里

UI是基于CListCtrl的MFC控件。

为了解决这个问题,我将处理n分为两个线程,一个获取数据并对其进行处理,另一个将显示它,即GUI。

我需要一些方法来通知UI线程,数据已被提取和处理。该线程使用CreateThread创建。告诉另一个线程可以自己完成工作的最好方法是什么?

1 个答案:

答案 0 :(得分:2)

我建议如下:当您的单独线程必须通知GUI时,您应该将PostMessage调用到包含控件的窗口。

消息参数应该是用户定义的消息,例如由您定义的内容,例如

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

open my $fh, '<', 'example.txt' or die "unable to open file: $!";
my %hash;
while(<$fh>){
my @seq=split(/\)\s+/,$_);
foreach(@seq)
   {
$_=$_.") ";
#print $_;
if($_ =~ /(\d+)\s*TO\s*(\d+)/i ){
       my $num1=$1;
       my  $num2=$2;
my $diff=($num2-$num1)+1;
$hash{$_}=$diff;

  }
}
}
close($fh);
#print Dumper(\%hash);
print "enter the number: \n";
chomp(my $num=<>);
if($num == 20){
foreach(keys %hash){
print "$_ => $hash{$_} \n" if($hash{$_} == 20);
}
}
elsif($num > 20){
foreach(keys %hash){
print "$_ => $hash{$_} \n" if($hash{$_} >  20);
}
}

另外两个参数(LPARAM和LPARAM)将包含您需要传递给GUI的数据。因此,在CreateThread中,您需要传递一些有关将接收消息的窗口的信息(如果使用MFC则为CWnd指针,否则为HWND句柄)。

然后你需要在你的窗口内处理这条消息(参见有关ON_COMMAND等宏的参考资料)