C++/MFC线程间通信

1.通过全局变量方式

mfcDlg.cpp

 1 int g_num; //全局变量
 2 UINT _cdecl ThreadWrite(LPVOID lpParameter)
 3 {
 4     g_num = 100;
 5     while (1)
 6     {
 7         g_num++;
 8         Sleep(50);
 9     }
10     return 0;
11 }
12 UINT _cdecl ThreadRead(LPVOID lpParameter)
13 {
14     CString str;
15     while (true)
16     {
17         str.Format(_T("%d"),g_num);
18         AfxMessageBox(str);
19     }
20     return 0;
21 }
22
23 void CmfcThreadDlg::OnBnClickedOk()
24 {
25     AfxBeginThread(ThreadWrite, NULL);
26     AfxBeginThread(ThreadRead, NULL);
27 }

如果要在1.cpp中使用g_num,需要在mfcDlg.cpp的头文件中声明extern int g_num。1.cpp中要包含mfcDlg.h

2.通过主对话框类的成员变量,在创建线程时传递主对话框类的指针;

3.界面线程间通信。

界面线程创建时,无法传递参数。

主线程在创建界面线程时,有返回值CWinThread*,即是子线程的指针,使用时类型转换即可。

1 void CmfcThreadDlg::OnBnClickedthread()
2 {
3     // TODO: 在此添加控件通知处理程序代码
4     //创建界面线程
5     CWinThread* pthread= AfxBeginThread(RUNTIME_CLASS(CUIThreadApp));
6     ((CUIThreadApp*)pthread)->child_num = 100; //child_num为子线程的成员变量
7 }

子线程被创建后可以通过AfxGetApp来得到项目主线程的指针。

1 void CTestDlg::OnBnClickedCancel()
2 {
3     // TODO: 在此添加控件通知处理程序代码
4     CWinApp* pApp = AfxGetApp();
5     ((CmfcThreadApp*)pApp)->parent_num=1000;  //项目主线程为cmfcThreadApp
6 }

原文地址:https://www.cnblogs.com/sclu/p/11643013.html

时间: 2024-10-05 22:02:52

C++/MFC线程间通信的相关文章

【转】VC 线程间通信的三种方式

原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通过在主线程对此变量值的改变而实现对子线程的控制.      由于这里的全局变量需要在使用它的线程之外对其值进行改变,这就需要通过volatile关键字对此变量进行说明.使用全局变量进行线程通信的方法非常简单

iOS开发NSOperation 三:操作依赖和监听以及线程间通信

一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation ViewController /** * 1:NSOperation的使用:1:先创建队列NSOperationQueue:若不创建队列直接封装任务则默认在当前线程中串行执行任务,其队列分为两种主队列和非主队列,主队列和GCD中的主队列一样[NSOperationQueue mainQueue],而alloc in

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

NSThread&amp;线程间通信

创建和启动线程 一个NSThread对象就代表一条线程 创建.启动线程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMainThread; // 是否

线程同步--线程间通信

一.线程同步 线程的同步方法跟其他系统下类似,我们可以用原子操作,可以用 mutex,lock 等. iOS 的原子操作函数是以 OSAtomic 开头的,比如:OSAtomicAdd32, OSAtomicOr32 等等.这些函数可以直接使用,因为它 们是原子操作. iOS 中的 mutex 对应的是 NSLock,它遵循 NSLooking 协议,我们可以使用 lock, tryLock, lockBeforeData:来加锁,用 unLock 来解锁.使用示例: BOOL moreToDo

java多线程系列5-死锁与线程间通信

这篇文章介绍java死锁机制和线程间通信 死锁 死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象. 同步代码块的嵌套案例 public class MyLock { // 创建两把锁对象 public static final Object objA = new Object(); public static final Object objB = new Object(); } public class DieLock extends Thread { private b

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

线程间通信的三种方式(NSThread,GCD,NSOperation)

一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic)  UIImageView *imageView; @end @implementation ViewCo

线程间通信与同步

线程间通信的两个基本问题是互斥和同步. 同步:一个线程的执行依赖于另一个线程的消息. 互斥:对共享资源的排他性,一个线程必须等待别的线程释放公共资源之后才能继续执行. 同步机制(Win32中):事件,信号量,互斥量,临界区 各种同步方式: #全局变量 win32多线程通信的最方式,但用全局变量同步会有两个弊端,应该避免 >主线程没有进入休眠状态,依然会消耗CPU资源 >如果主线程优先级比ThreadFunc高,则全局变量无法在ThreadFunc中被改变,这样线程无法得到通知 #事件 由于ev