TThread и функции ожидания
{
private:
protected:
void __fastcall Execute();
void __fastcall Ping();//производится фоновое пингование
public:
__fastcall PingThread(bool CreateSuspended);
};
Пишем реализации методов:
{
Synchronize(Ping);
}
//------------------------------------------------------
void __fastcall PingThread::Ping()
{
//---- Place thread code here ----
//не важно что здесь, может быть даже ничего
//главное вот:
Sleep(10000);//как только доходим до сюда ожидание
//начинают выполнять все потоки программы
//т.е. программа висит, пока не выполнтся Sleep()
}
Параметр Sleep() задан для примера. По идее там 1000, т.е. секунда. Точно такая же ситуация складывается с WaitForSingleObject(...). Как с этим бороться? Нужно что бы программа была действительно многопоточной.
В принципе вроде бы нашел обходной путь - если вызывать эти функции из Execute() то нормально. Но хотелось бы сделать напрямую.
Не синхронизируй ожидающую функцию-то, епрст ;)
НОВЫЙ ГОД, понимаю :D
Не синхронизируй ожидающую функцию-то, епрст ;)
НОВЫЙ ГОД, понимаю :D
Блин, дошел до этого. И написал, если ты не заметил. Только все как-то насквозь криво это получается. Понятно, что то, что выполняется в Synchronize() выполняется как бы в основном потоке программы. В том то и состоит бред. Как бы многопоточность и как бы эмуляция. Ладно, мне кажется, что по другому ни как нельзя, исходя моего понимания метода Synchronize(). Да будет так.
Блин, дошел до этого. И написал, если ты не заметил. Только все как-то насквозь криво это получается. Понятно, что то, что выполняется в Synchronize() выполняется как бы в основном потоке программы. В том то и состоит бред. Как бы многопоточность и как бы эмуляция. Ладно, мне кажется, что по другому ни как нельзя, исходя моего понимания метода Synchronize(). Да будет так.
Метод Execute предполагает весьма определенное его использование. Вся функциональность потока должна быть выложена именно в этой функции, и через Synchronize нужно запускать только ту часть функций, которые собственно и требуют синхронного исполнения. Не нужно полностью синхронизить функцию, нужно только то, что нужно %).
{
private:
protected:
void __fastcall Execute();
void __fastcall Ping();//производится фоновое пингование
void __fastcall ToMainForm();//Вывоз результата на окно
int PingValue;
public:
__fastcall PingThread(bool CreateSuspended);
};
void __fastcall PingThread::Execute()
{
Ping();//В пинге сейчас нельзя использовать ничего требующего синхрониза...
Synchronize(ToMainForm);//Все требующее в отдельной синхронизируемой функции.
}
//------------------------------------------------------
void __fastcall PingThread::Ping()
{
//---- Place thread code here ----
//не важно что здесь, может быть даже ничего
//главное вот:
Sleep(10000);//как только доходим до сюда ожидание
//начинают выполнять все потоки программы
//т.е. программа висит, пока не выполнтся Sleep()
PingValue = 10000;
}
void __fastcall PingThread::ToMainForm()
{
MainForm->LabelXZ->Caption = PingValue;
}
Метод Execute предполагает весьма определенное его использование. Вся функциональность потока должна быть выложена именно в этой функции, и через Synchronize нужно запускать только ту часть функций, которые собственно и требуют синхронного исполнения. Не нужно полностью синхронизить функцию, нужно только то, что нужно %).
Да понял же уже говорю.