Передача парам. в функц. OnTerminate у потока
В главной форме создаю поток:
TMyThread *Thrd = new TMyThread(...);
Thrd->OnTerminate = Func;
Как передать параметры в Func, можно ли это сделать без глобальных переменных?
Здравствуйте! Вопрос такой:
В главной форме создаю поток:
TMyThread *Thrd = new TMyThread(...);
Thrd->OnTerminate = Func;
Как передать параметры в Func, можно ли это сделать без глобальных переменных?
Если я правильно понял, то это тот же вопрос, что задавал я. Вот ветка: Передача данных в поток там есть решение.
Если я правильно понял, то это тот же вопрос, что задавал я. Вот ветка: ...
Не совсем, я читал твою ветку, ты хочел передавать переменную в поток, а я хочу передать переменную в функцию которая находится не в классе потока, а в классе главной формы и вызывается, на сколько я понимаю, после уничтожения потока.
Не совсем, я читал твою ветку, ты хочел передавать переменную в поток, а я хочу передать переменную в функцию которая находится не в классе потока, а в классе главной формы и вызывается, на сколько я понимаю, после уничтожения потока.
Наверное тебе нужно более корректно сформулировать свой вопрос - ты хочешь отследить момент завершения потока насколько я понимаю - посмотри здесь
Наверное тебе нужно более корректно сформулировать свой вопрос - ты хочешь отследить момент завершения потока насколько я понимаю - посмотри здесь
ААААААААААААААА :x может хватит мне новые задачи придумывать??? Проблема такая:
Есть класс MyThread наследник TThread
Есть класс MyForm наследник TForm - у него есть много всего, но главное у него есть две функции:
MyForm :: Func()
{
//код
}
MyForm :: ButonClick
{
...
TMyThread *Thrd = new TMyThread(/*здесь разные переменные*/);
Thrd->OnTerminate = Func;
...
}
Функция Func начинается после завершения потока Thrd.
И мне не надо в поток передавать переменные, то есть я это умею, мне не надо следить за завершение потока, пусть ОС следит или кто там должен этим заниматься.
А надо передать в функцию Func (которая находится в классе MyForm) одну из тех переменных которые я передаю в конструктор TMyThread, вот и все!!!
Все просто это либо можно сделать, либо нельзя, лично я пока не разу не встречал упомянания об этом.
Если вы встречали какой-нибудь способ это сделать напишите пожалуйста...
Сейчас это реализовано с помощью глобальной переменной и глобального флага.
...
А надо передать в функцию Func (которая находится в классе MyForm) одну из тех переменных которые я передаю в конструктор TMyThread, вот и все!!!
Все просто это либо можно сделать, либо нельзя, лично я пока не разу не встречал упомянания об этом.
Ы-ы-ы кто-ж его посадит, он же памятник!
1. OnTerminate имеет тип:
typedef void __fastcall (__closure *TNotifyEvent)(TObject *Sender);
2. Где-то в недрах TThread кусочек кода типа:
...
if(!FOnTerminate)
FOnTerminate(this);
...
так, что все за тебя уже передали.
Ы-ы-ы кто-ж его посадит, он же памятник!
1. OnTerminate имеет тип:
typedef void __fastcall (__closure *TNotifyEvent)(TObject *Sender);
2. Где-то в недрах TThread кусочек кода типа:
...
if(!FOnTerminate)
FOnTerminate(this);
...
так, что все за тебя уже передали.
То есть вы хотите сказать что я могу исспользовать
все переменные описанные мною в TMyThread, я правильно понял? Если да, то как?
То есть вы хотите сказать что я могу исспользовать
все переменные описанные мною в TMyThread, я правильно понял?
Да.
Если да, то как?
как обычно через Sender...
Да.
как обычно через Sender...
Если вы имеете в виду
Sender->FuncFromMyThread();
или
(TMyThread)Sender->FuncFromMyThread();
То так я попробовал, не работает, если вы имели в виду др. метод, то напишите пожалуйста.
Если вы имеете в виду
Sender->FuncFromMyThread();
или
(TMyThread)Sender->FuncFromMyThread();
То так я попробовал, не работает, если вы имели в виду др. метод, то напишите пожалуйста.
dynamic_cast + Sender, хотя должно и во втором твоем варианте работать. Неработает как, что говорит?
Если вы имеете в виду
Sender->FuncFromMyThread();
или
(TMyThread)Sender->FuncFromMyThread();
То так я попробовал, не работает, если вы имели в виду др. метод, то напишите пожалуйста.
or
or
О! Ништяк, это именно то! Спасибо огромное!
О! Ништяк, это именно то! Спасибо огромное!
Не хочу показаться навязчивым, но при нисходящим приведении типов используется dynamic_cast ...
Не хочу показаться навязчивым, но при нисходящим приведении типов используется dynamic_cast ...
Я не знаю что это, обьясни если не трудно, спасибо.
Не хочу показаться навязчивым, но при нисходящим приведении типов используется dynamic_cast ...
:) Более правильно сказать, что это не очень хорошой стиль программирования - так как static_cast проверяет тип ТОЛЬКО на этапе компиляции. За безопасность надо платить - поэтому при приведении классов более БЕЗОПАСНО использовать dynamic_cast в связи с тем, что проверка выполняется в процессе выполнения и в случае некорректного преобразования сгенерируется исключение которое можно обработать - но при этом соответственно с допзатратами.
Что использовать в конкретном случае - решать надо в конкретной задаче.
Единственно, на что надо обращать внимание - если один тип приведения используется он должен использоваться везде одинаково - а исключения должны быть явно декларированы.
:) Более правильно сказать...
Все ясно, где-то я это уже слышал, но спасибо что напомнил, теперь наверно больше не забуду.