Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TThread и функции ожидания

243
03 января 2006 года
pacific_7
1.9K / / 06.09.2004
Нужно реализовать многопоточность. Делаем класс:
 
Код:
class PingThread : public TThread
{            
private:
protected:
        void __fastcall Execute();
        void __fastcall Ping();//производится фоновое пингование
public:
        __fastcall PingThread(bool CreateSuspended);
};

Пишем реализации методов:
Код:
void __fastcall PingThread::Execute()
{
        Synchronize(Ping);
}
//------------------------------------------------------

void __fastcall PingThread::Ping()
{
        //---- Place thread code here ----
        //не важно что здесь, может быть даже ничего
        //главное вот:
        Sleep(10000);//как только доходим до сюда ожидание
                     //начинают выполнять все потоки программы
                     //т.е. программа висит, пока не выполнтся Sleep()
}

Параметр Sleep() задан для примера. По идее там 1000, т.е. секунда. Точно такая же ситуация складывается с WaitForSingleObject(...). Как с этим бороться? Нужно что бы программа была действительно многопоточной.
243
03 января 2006 года
pacific_7
1.9K / / 06.09.2004
В принципе вроде бы нашел обходной путь - если вызывать эти функции из Execute() то нормально. Но хотелось бы сделать напрямую.
4.8K
03 января 2006 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by pacific_7
В принципе вроде бы нашел обходной путь - если вызывать эти функции из Execute() то нормально. Но хотелось бы сделать напрямую.



Не синхронизируй ожидающую функцию-то, епрст ;)
НОВЫЙ ГОД, понимаю :D

243
03 января 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Jump
Не синхронизируй ожидающую функцию-то, епрст ;)
НОВЫЙ ГОД, понимаю :D


Блин, дошел до этого. И написал, если ты не заметил. Только все как-то насквозь криво это получается. Понятно, что то, что выполняется в Synchronize() выполняется как бы в основном потоке программы. В том то и состоит бред. Как бы многопоточность и как бы эмуляция. Ладно, мне кажется, что по другому ни как нельзя, исходя моего понимания метода Synchronize(). Да будет так.

4.8K
03 января 2006 года
Jump
128 / / 09.11.2005
Цитата:
Originally posted by pacific_7
Блин, дошел до этого. И написал, если ты не заметил. Только все как-то насквозь криво это получается. Понятно, что то, что выполняется в Synchronize() выполняется как бы в основном потоке программы. В том то и состоит бред. Как бы многопоточность и как бы эмуляция. Ладно, мне кажется, что по другому ни как нельзя, исходя моего понимания метода Synchronize(). Да будет так.



Метод Execute предполагает весьма определенное его использование. Вся функциональность потока должна быть выложена именно в этой функции, и через Synchronize нужно запускать только ту часть функций, которые собственно и требуют синхронного исполнения. Не нужно полностью синхронизить функцию, нужно только то, что нужно %).

Код:
class PingThread : public TThread
{            
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;
}
243
04 января 2006 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by Jump
Метод Execute предполагает весьма определенное его использование. Вся функциональность потока должна быть выложена именно в этой функции, и через Synchronize нужно запускать только ту часть функций, которые собственно и требуют синхронного исполнения. Не нужно полностью синхронизить функцию, нужно только то, что нужно %).


Да понял же уже говорю.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог