原来的程序使用C++实现的,执行起来貌似也是按点击顺序来执行的,但是在C#用Mutex类无法达到效果
CArkMutex::~CArkMutex()
{
if (bCreate) {
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
}
if (m_hProc != NULL)
CloseHandle( m_hProc);
}
bool CArkMutex::Create(const char *pszName)
{
if (bCreate)
return false;
m_hMutex = CreateMutex(0, FALSE, pszName);
if (m_hMutex) {
bCreate = true;
}
return bCreate;
}
bool CArkMutex::Enter()
{
if (!bCreate)
return false;
WaitForSingleObject(m_hMutex, INFINITE);
return true;
}
bool CArkMutex::Leave()
{
if (!bCreate)
return false;
ReleaseMutex(m_hMutex);
return true;
}
原来的程序使用C++实现的,执行起来貌似也是按点击顺序来执行的,但是在C#用Mutex类无法达到效果
CArkMutex::~CArkMutex()
{
if (bCreate) {
ReleaseMutex(m_hMutex);
CloseHandle(m_hMutex);
}
if (m_hProc != NULL)
CloseHandle( m_hProc);
}
bool CArkMutex::Create(const char *pszName)
{
if (bCreate)
return false;
m_hMutex = CreateMutex(0, FALSE, pszName);
if (m_hMutex) {
bCreate = true;
}
return bCreate;
}
bool CArkMutex::Enter()
{
if (!bCreate)
return false;
WaitForSingleObject(m_hMutex, INFINITE);
return true;
}
bool CArkMutex::Leave()
{
if (!bCreate)
return false;
ReleaseMutex(m_hMutex);
return true;
}
1
momocraft 2017-05-01 10:25:27 +08:00 1
能不能说一下确保的目的是什么?
|
2
sunhk25 OP @momocraft 生成的文件是类似 HHmmss.txt 这样的以秒为单位的文件名,所以一秒内多次执行时需要控制进程等待
|
3
ipconfiger 2017-05-01 10:50:53 +08:00 1
A 中每次点击都先用一个线程安全的 FIFO 对列存起来, 然后在一个独立的线程中一个一个取出来去调用 B
|
4
zmj1316 2017-05-01 10:52:45 +08:00 1
A 里面搞一个队列,点一次就向队列里丢一个,另外 A 开一个新线程,每次从队列里面取一个出来调用 B,并且阻塞等待 B 结束,这样可以保证只有一个 B 在执行,并且顺序和队列一致。
如果只用单线程也可以实现,阻塞改成 poll 就行了 |
5
sunhk25 OP @ipconfiger @zmj1316 在 A 里实现的话确实可以,问题是 A 程序无法修改,如何在 B 中实现
|
6
ipconfiger 2017-05-01 11:40:17 +08:00
B 里面也可以做到, 思路类似, 不过因为 B 是被调用方, 所以需要用额外的跨进程存储结构来维持对列
|
7
Valyrian 2017-05-01 11:42:22 +08:00 via iPad 1
Lockfile
|
8
sunhk25 OP @ipconfiger 试了几种队列调用方式(lock,ThreadPool),在 B 中测试时可以保证顺序,但是从 A 里调用 B 时,顺序还是随机。请问在 B 中如何管理额外的跨进程队列
|
11
sunhk25 OP |