[C++] Переключение контекстов потока в Windows Mobile
От: __Nikel Россия http://inside-dev.ru
Дата: 01.10.08 09:15
Оценка: 51 (1)
Небольшая библиотека переключения контекстов потока для 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
);



Буду рад, если материал окажется вам полезен.
Исходные тексты здесь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.