OnMainInit()

Страницы: 1
RSS
OnMainInit(), Новый луа-колбек
 
В нынешнем виде пара 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 использовать только для ожидания завершения этого лишнего потока, когда то же самое могло бы быть из коробки.

 
Здравствуйте, Anton.
На данный момент проблема с отработкой функции OnInit() все еще разбирается.
Ваше предложение зарегистрировали как пожелание на создание функции OnMainInit(). Мы постараемся рассмотреть его и сообщить Вам результаты анализа.  Впоследствии, по результатам анализа, будет приниматься решение о  реализации пожелания в будущих версиях ПО.
QUIK clients support
 
Цитата
Alexander Kopyatkevich написал:
Здравствуйте, Anton.
На данный момент проблема с отработкой функции OnInit() все еще разбирается.
Ваше предложение зарегистрировали как пожелание на создание функции OnMainInit(). Мы постараемся рассмотреть его и сообщить Вам результаты анализа.  Впоследствии, по результатам анализа, будет приниматься решение о  реализации пожелания в будущих версиях ПО.
Благодарю за регистрацию пожелания. Пара замечаний вдогонку.

1. Подобный колбек призван не столько победить ошибку с OnInit(), сколько сильно облегчить программирование встраиваемой длл, поскольку, будучи уже в потоке main в то время как квик нас ждет, мы можем сделать много чего полезного, что нельзя сделать из основного потока квика и в настоящее время откладывается до начала main(), где зачастую уже "неинтересно" это все делать, т.к. квик отпущен и поезд ушел. Как писал выше, можно сделать свой мейн с преферансом и прочим, но это плюс один поток.

2. По поводу OnInit() попался мне на глаза кусочек кода и, думается, примерно как-то так в квике и сделано. Тогда возникает подозрение, что после поимки ошибки в OnInit ссылка на луа-стек для main не выпускается и отсюда не происходит сборка мусора. Так сказать, в меру сил пытаюсь помочь в поисках (а-ля Чумак, через телевизор).
 
Здравствуйте, Anton!
Дополнили Ваши замечания к пожеланию.
Благодарим за дополнительную информацию!
QUIK clients support
Страницы: 1
Читают тему (гостей: 1)
Наверх