- 主题:PostMessage() 线程安全吗?
能不能从子线程调用 PostMessage(hwnd, ...) 唤醒主线程?
--
FROM 183.253.138.*
能的。绝对安全。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 能不能从子线程调用 PostMessage(hwnd, ...) 唤醒主线程?
--
FROM 114.84.111.*
主线程有消息循环才能唤醒,消息本身安全,但消息的参数需要自己处理
如果主线程有消息循环,写个简单COM接口marshal一下从任何线程里直接调用就行了,消息,参数拷贝,线程同步等脏活MS都已经包好了
【 在 hgoldfish 的大作中提到: 】
: 能不能从子线程调用 PostMessage(hwnd, ...) 唤醒主线程?
--
修改:xiaoju FROM 155.64.23.*
FROM 155.64.23.*
win32api 的设计还是很牛X的啊。在 linux 下消息循环需要借助 pipe 或者 eventfd 才能中断 epoll()/kqueue() 函数。
在 Windows 下有 PostMessage() 一下就搞定了。不过美中不足的是,Windows 得创建窗口,获得 hwnd 才能搞事。
【 在 javaboy (喝了咖啡就话多-_-;) 的大作中提到: 】
: 能的。绝对安全。
--
FROM 183.253.138.*
我消息循环放在子线程里面。能唤醒?
只想写个简单的消息循环,使用 WSAAsyncSelect()/SetTimer() 实现异步 IO,我肯定不会去碰 COM 那种巨坑。
按说得用 IOCP,但太麻烦了,windows 平台凑合着能用就好。
【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: 主线程有消息循环才能唤醒,消息本身安全,但消息的参数需要自己处理
: 如果主线程有消息循环,写个简单COM接口marshal一下从任何线程里直接调用就行了,消息,参数拷贝,线程同步等脏活MS都已经包好了
--
FROM 183.253.138.*
既然碰了win32api,用COM就是正解,要不就应该完全上跨平台的库
收发消息看似简单其实坑非常多。反而是COM只要你线程入口正确调用CoInitialize,跨线程marshal,就不会有任何问题
【 在 hgoldfish 的大作中提到: 】
: 我消息循环放在子线程里面。能唤醒?
: 只想写个简单的消息循环,使用 WSAAsyncSelect()/SetTimer() 实现异步 IO,我肯定不会去碰 COM 那种巨坑。
: 按说得用 IOCP,但太麻烦了,windows 平台凑合着能用就好。
: ...................
--
FROM 155.64.23.*
没有界面纯终端的 IO 程序,偶尔用一两个 win32api 不需要去碰 COM.
话说 select() 也太弱了,windows 怎么也得提供一个 poll() 吧。反正大家也不会在 windows 上跑重 IO 应用。iocp 好是好,用起来不太方便。
【 在 xiaoju (可爱的龙猫) 的大作中提到: 】
: 既然碰了win32api,用COM就是正解,要不就应该完全上跨平台的库
: 收发消息看似简单其实坑非常多。反而是COM只要你线程入口正确调用CoInitialize,跨线程marshal,就不会有任何问题
--
FROM 183.253.138.*
PostThreadMessage是一个Windows API函数。其功能是将一个队列消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
fwrite是线程安全的吗?两个线程同时fwrite(10MB),会互相重叠吗?我认为是线程安全的,要不然VC6的6个运行库:-) 分啥单/多线程
CreateEvent, CreateSemaphone, WaitForSingleObject, RaiseEvent, MsgWaitForMultipleObjects HANDLE hTemp = GetCurrentThread(); DWORD nID = GetCurrentThreadId(); ...
有个叫大菊的,他的座右铭是“不能流芳百世,便要遗臭万年” :-)
--
修改:billybear04 FROM 106.121.168.*
FROM 106.121.168.*
fwrite有源代码的,操作file stream之前会加锁,是线程安全的
【 在 billybear04 的大作中提到: 】
: PostThreadMessage是一个Windows API函数。其功能是将一个队列消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
: fwrite是线程安全的吗?两个线程同时fwrite(10MB),会互相重叠吗?我认为是线程安全的,要不然VC6的6个运行库:-) 分啥单/多线程
: CreateEvent, CreateSemaphone, WaitForSingleObject, RaiseEvent, MsgWaitForMultipleObjects HANDLE hTemp = GetCurrentThread(); DWORD nID = GetCurrentThreadId(); ...
: ...................
--
FROM 125.35.121.*
【 在 z16166 (Netguy) 的大作中提到: 】
: fwrite有源代码的,操作file stream之前会加锁,是线程安全的
我有个疑问。fwrite属于C运行库,最终写文件是WriteFile?在C运行库里加锁很可行。
PostMessage属于WIN32 API,是kernel32, user32或某个DLL里的。
在自己的C程序里调用PostMessage,是直接进到DLL里去了,还是C运行库可以插一杠子加锁?
kernel, user……算Windows的内核了,PostMessage算Windows内核函数,在内核里加锁吗?
linux下调用系统调用,C程序和C运行库打交道,C运行库里的“存根”代码会通过trap/interrupt进入内核,实现用户/内核态的切换,Windows下应该有类似的过程,是如何实现的?kernel32.dll是不是还在用户态,也会中断,真正实现功能的代码在别的地方?
--
FROM 106.121.168.*