В нынешнем виде пара OnInit() / main() не позволяет надежно инициализировать скрипт, поскольку в момент выполнения OnInit() поток main еще не существует (или существует, но недоступен из скрипта), а в момент начала выполнения main() после выхода из OnInit() уже произоошли (или могли произойти) какие-то события, которые без принятия специальных мер будут пропущены. Очень удобно было бы иметь дополнительный колбек, назовем его условно OnMainInit(), выполняемый после создания потока main в контексте этого потока, но при условии, что основной поток квика ждет завершения этого колбека, то есть ни один другой колбек между OnInit и OnMainInit гарантированно не был дернут.
Очень грубо, только чтобы идею донести, как это могло бы выглядеть в коде квика
Очень грубо, только чтобы идею донести, как это могло бы выглядеть в коде квика
| Код |
|---|
void QuikInitializeLuaScript(...)
{
// ...
HANDLE hevent = CreateEvent(...);
HANDLE hmainthread = _beginthreadex( ... , scriptmainproc, hevent, CREATE_SUSPENDED);
script->OnInit();
ResumeThread(hmainthread);
WaitForSingleObject(hevent);
// (по-хорошему тут надо на двух объектах ждать, на событии и самом потоке, кто первый выстрелит)
// и только теперь продолжаем основной поток квика
}
unsigned __stdcall scriptmainproc(void * pvoid)
{
HANDLE hevent = reinterpret_cast<HANDLE>(pvoid);
myscript->OnMainInit();
SetEvent(hevent);
myscript->main();
return 0;
}
|
Собственно, так и приходится делать, просто жаль создавать еще один поток, а main использовать только для ожидания завершения этого лишнего потока, когда то же самое могло бы быть из коробки.