У тебя же была мысль перевести ВСЕ мероприятия в один поток
Собственно, я это и имел ввиду, когда говорил про INFINITE
Т.е примерно такое
#pas
...
procedure MyCallback(pCtx:pointer; pUserData:pointer); stdcall;
var pCls:THiImageLoader;
begin
pCls := THiImageLoader(pUserData);
SetEvent(pCls.hOK);
// и больше НИЧЕГО!!!
end;
procedure THiImageLoader._work_doLoad;
...
FImgCtx.SelectChanges(IMGCHG_COMPLETE,0,1);
WaitForSingleObject(hOK,INFINITE);
...
-- тогда это нечистая сила, однако.
------------ Дoбавленo:
Вообще-то, если сторонний поток (в котором предположим работает MyCallBack) сотворяет какое-то действие связанное как-то с SendMessage для хэндла основного потока (собственно, почти любое обращение к визуальному элементу), то он уходит в слип до тех пор, пока основной поток не сделает обращение к очереди сообщений (GetMessage или PeekMessage).
А отсюда не один логический выход (сделать эти самые GetMessage или PeekMessage), а два -- еще и НЕ делать действий, "связанных как-то с SendMessage для хэндла основного потока" в этом стороннем потоке.