
原来的程序使用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 May 1, 2017 能不能说一下确保的目的是什么? |
3 ipconfiger May 1, 2017 A 中每次点击都先用一个线程安全的 FIFO 对列存起来, 然后在一个独立的线程中一个一个取出来去调用 B |
4 zmj1316 May 1, 2017 A 里面搞一个队列,点一次就向队列里丢一个,另外 A 开一个新线程,每次从队列里面取一个出来调用 B,并且阻塞等待 B 结束,这样可以保证只有一个 B 在执行,并且顺序和队列一致。 如果只用单线程也可以实现,阻塞改成 poll 就行了 |
5 sunhk25 OP @ipconfiger @zmj1316 在 A 里实现的话确实可以,问题是 A 程序无法修改,如何在 B 中实现 |
6 ipconfiger May 1, 2017 B 里面也可以做到, 思路类似, 不过因为 B 是被调用方, 所以需要用额外的跨进程存储结构来维持对列 |
7 Valyrian May 1, 2017 via iPad Lockfile |
8 sunhk25 OP @ipconfiger 试了几种队列调用方式(lock,ThreadPool),在 B 中测试时可以保证顺序,但是从 A 里调用 B 时,顺序还是随机。请问在 B 中如何管理额外的跨进程队列 |
11 sunhk25 OP |