是否可以在C / C ++ for Windows和UNIX而不是iOS上为iOS Objective-c“performSelectorOnMainThread”功能创建一些等效功能。 非常感谢。
答案 0 :(得分:1)
不,你必须自己动手。一种方法是保持一个全局函数指针,主线程检查主循环的每次迭代。例如:
// Global variables
pthread_mutex_t gMutex = PTHREAD_MUTEX_INITIALIZER;
void (*gFuncPtr)(void*);
void *gFuncArg;
// Your program's main loop in the main thread
while(programIsRunning())
{
// If we have a function to call this frame, call it, then do the rest of
// our main loop processing
void (*funcPtr)(void*);
void *funcArg;
pthread_mutex_lock(&gMutex);
funcPtr = gFuncPtr;
funcArg = gFuncArg;
gFuncPtr = NULL;
pthread_mutex_unlock(&gMutex);
if(funcPtr != NULL)
(*funcPtr)(funcArg);
// Rest of main loop
...
}
// Call this function from another thread to have the given function called on
// the main thread. Note that this only lets you call ONE function per main
// loop iteration; it is left as an exercise to the reader to let you call as
// many functions as you want. Hint: use a linked list instead of a single
// (function, argument) pair.
void CallFunctionOnMainThread(void (*funcPtr)(void*), void *funcArg)
{
pthread_mutex_lock(&gMutex);
gFuncPtr = funcPtr;
gFuncArg = funcArg;
pthread_mutex_unlock(&gMutex);
}
对于Windows而不是POSIX,分别使用CRITICAL_SECTION
,EnterCriticalSection
和LeaveCriticalSection
代替pthread_mutex_t
,pthread_mutex_lock
和pthread_mutex_unlock
,并且不要忘记适当地初始化和取消初始化关键部分。
答案 1 :(得分:0)
如果它全部在iPhone上,您可以使用CFRunLoopAddSource(),或通过具有Objective C ++文件(扩展名.mm)在performSelectorOnMainThread上提供C ++友好的包装。我推荐第二种方式。
如果它位于不同的平台上 - 请指定平台。 Windows有这样的手段(APC和消息)。
没有平台无关的方式,因为没有平台无关的线程。
答案 2 :(得分:0)
如果必须在unix和windows上运行(并且你使用的是c ++),请使用boost for threads&互斥