В нынешнем виде пара 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 использовать только для ожидания завершения этого лишнего потока, когда то же самое могло бы быть из коробки.