多线程实现消息通信

多线程实现消息通信

在测试学习线程创建及通信过程中,测试多种方式,感觉此种较为简单易懂实用

#include <stdio.h>
#include <windows.h>

struct info
{
    HWND hWnd;
    DWORD dwThreadId;
    char* thing;
};

DWORD  WINAPI ThreadFun(LPVOID lpParam);// Main Thread
DWORD  WINAPI Thread1(LPVOID lpParam);    // Sub Thread

int main()
{
    info Info;
    char th[] = "somthing";
    Info.hWnd = GetActiveWindow();//GetSafeHwnd(); // get current HWND
    Info.thing = th;
    DWORD dwThreadID;
    HANDLE hThread = CreateThread(NULL,0, ThreadFun,&Info, NULL,&dwThreadID);
    Info.dwThreadId = dwThreadID;
    WaitForSingleObject(hThread, INFINITE);
    CloseHandle(hThread);
    HANDLE hCurrentProc = GetCurrentProcess();
    printf("%08X %08X\n", hThread, hCurrentProc);

    return 0;
}

DWORD  WINAPI ThreadFun(LPVOID lpParam)
{
    info* Info = (info*)lpParam;//传递的消息结构体
    printf("Thread Start!!!!!\n");

    printf("ThreadID %d\n", Info->dwThreadId);//
    MSG msg;

    info mInfo;
    mInfo.dwThreadId = GetCurrentThreadId();

    HANDLE hThread1 = CreateThread(NULL,0, Thread1, &mInfo, NULL, NULL);
    printf("SomeThing %s\n", Info->thing);
//主线程实现消息检测循环,当接收退出信息退出循环
    while(1)
    {
        PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
        if(msg.message == WM_QUIT)
        {
            printf("\nGet message(Quit) from Thread1\n\n");
            CloseHandle(hThread1);
            break;
        }
    }
    printf("Thread Over!\n");
    return 0;
}
//子线程
DWORD  WINAPI Thread1(LPVOID lpParam)
{
    info* Info = (info*)lpParam;
    printf("\n\tThread1 Start!!!!!\n");
    printf("\tThis ThreadID(%d) is MainThreadID!!!!!\n", Info->dwThreadId);
    printf("\tThread1ID %d\n", GetCurrentThreadId());
    int ret = PostThreadMessage(Info->dwThreadId, WM_QUIT, NULL, NULL);
    if(ret == ERROR_INVALID_THREAD_ID)
        printf("\tpostthreadmessage Fail!!!!!\n");
    else
        printf("\tret: 0x%08x\n", ret);
    return 0;
}
时间: 2024-09-29 23:56:00

多线程实现消息通信的相关文章

信号,信号量,锁,条件变量,消息通信,共享内存,RPC (一)

在实际项目当中,经常需要把一个功能分成多个子模块实现.那么,这些子模块之间该如何关联起来呢?静态地看,模块可以看作一组完成相同功能的函数:而动态地看,模块可以是一个独立的进程.线程或者一个中断服务或者信号服务例程.根据不同的具体业务实现,它们之间可能是静态调用.动态互斥.同步.唤醒等关系.静态的调用很好实现,上层的函数调用底层的函数即可.那么,动态互斥.同步.唤醒等关系,又该如何实现呢?这就设计到我们将要讨论的信号.进程间消息通信.共享内存.线程互斥同步条件变量.RPC等手段.下面就按照Linu

linux之多线程fork:进程通信

++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func(int sig); sig 指明了所要处理的信号类型,handler是SIG_IGN,SIG_DFL或者返回值为整数的函数地址. 当执行了signal函数后,进程只要接收到类型为sig 的信号,就立即执行 func()函数,不管其正在执行程序的哪一部分.当func()函数执行结束后,程序返回到进程被

NSNotificationCenter消息通信机制介绍(KVO)

NSNotificationCenter消息通信机制介绍(KVO) 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息                [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];        参数介绍:         

多线程之间的通信实例讲解

                 多线程之间的通信实例讲解对于线程来说,说白了,就是一个函数,如果大家对于这章函数都有理解,那我对于操作系统,线程和进程间的通信会有一个新的认识!接下来我会对每一行代码进行注释,在此过程中,大家也可以对c语言有一个崭新的认识. 第一个函数,创建两个线程. #include <stdio.h>#include <pthread.h>    这个头函数要包含,因为我们后续用的函数都是系统调用,因此需要申请头函数   这样在编译的时候,就可以找到此函数的源

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

ZeroMQ——一个轻量级的消息通信组件

ZeroMQ是一个轻量级的消息通信组件,尽管名字中包含了"MQ",严格上来讲ZeroMQ并不是"消息队列/消息中间件".ZeroMQ是一个传输层API库, 更关注消息的传输.与消息队列相比,ZeroMQ有以下一些特点: 点对点无中间节点 传统的消息队列都需要一个消息服务器来存储转发消息.而ZeroMQ则放弃了这个模式,把侧重点放在了点对点的消息传输上,并且(试图)做到极致.以为消息服务器最终还是转化为服务器对其他节点的点对点消息传输上.ZeroMQ能缓存消息,但是是

多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. 为了解决上述问题中的安全问题(在存放线程进行存放操作的时候, 打印线程不能对共有数据进行操作),所以应当对两个线程       操作共有数据的代码部分进行同步(使用synchronized(),来进行同步, 注意 :使用同一个对象作为同步锁. 二.等待唤醒机制. 在上述案例实现过后运行,会发现:打印

消息通信机制NSNotificationCenter -备

消息通信机制NSNotificationCenter的学习.最近写程序需要用到这类,研究了下,现把成果和 NSNotificationCenter是专门供程序中不同类间的消息通信而设置的,使用起来极为方便, 长话短说. 设置通知,就是说要在什么地方(哪个类)接受通知,一般在初始化中做. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test:) name:@"test" object:

多线程-线程间通信

1.多线程-线程间通信-问题演示 多线程间通信:多个线程处理同一资源,但是处理动作却不同. //创建一个资源描述.资源中有name sex.用于存储数据. class Resource{     String name;     String sex; } //需要定义一个输入任务描述.既然是线程任务,必须实现Runnable接口.  class Input implements Runnable{     private Resource r;     Input(Resource r){