Небольшая библиотека переключения контекстов потока для Windows Mobile — octx.
Может быть использована для реализации кооперативной многопоточности.
Для реализации кооперотивной многопоточности в Win32 использовуют файберы (fibers).
Проблема заключается в том, что в Windows Mobile SDK их попросту нет.
По своей структуре octx напоминает ucontext_t из glibc.
Использование:
#include <windows.h>
#include "octx.h"
DWORD WINAPI MyThreadProc(LPVOID lpParam)
{
return 0;
}
DWORD WINAPI YourThreadProc(LPVOID lpParam)
{
return 0;
}
int main(int argc, char* argv[])
{
DWORD dwThreadId;
HANDLE hThread = CreateThread(NULL, 0, &MyThreadProc, 0, 0, &dwThreadId);
if (hThread == NULL)
{
return -1;
}
octx::Context ctx;
if (octx::CreateContext(hThread, YourThreadProc, &ctx))
{
octx::Context oldctx;
octx::SwapContext(hThread, &ctx, &oldctx);
}
::WaitForSingleObject(hThread, INFINITE);
::CloseHandle(hThread);
return 0;
}
octx реализует следующие функции (думаю, в подробном описании они не нуждаются):
BOOL
CreateContext(
/* in */ HANDLE hThread,
/* in */ LPOCTX_START_ROUTINE lpStartAddress,
/* out */ Context* pCtx
);
BOOL
GetContext(
/* in */ HANDLE hThread,
/* out */ Context* pCtx
);
BOOL
SetContext(
/* in */ HANDLE hThread,
/* in */ const Context* pCtx
);
BOOL
SwapContext(
/* in */ HANDLE hThread,
/* in */ Context* pNewCtx,
/* out */ Context* pOldCtx
);
Буду рад, если материал окажется вам полезен.
Исходные тексты
здесь.