Дайте совет по работе с thread-ами

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

Программа запускает thread который тянет с SQL данные. Если с threadа изменять позицию ProgressBar то есть в Билдере thread-safe метод Syncronize. Но если Юзер дёргает окно, то thread ждёт.
Подскажите что-нибудь элегантное!
-------------
Лень - двигатель прогресса!
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

Неужели ни кто подобное не реализовывал?
Тогда так:

я имею переменную int в Thread-Classe, её родную инкрементирую. А в MainForm поставил Timer, он регулярно позицию ProgressBar-a опрашивает. Это tread-safe или нужно c CriticalSection работать?
-------------
Лень - двигатель прогресса!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если просто будешь опрашивать, то CriticalSection - это излишество. CriticalSectrion создана для совместного изменения разными зредами (процессами) одного и того же места в памяти.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
DeeJayC
Сообщения: 497
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

alexx писал(а):Неужели ни кто подобное не реализовывал?
Тогда так:

я имею переменную int в Thread-Classe, её родную инкрементирую. А в MainForm поставил Timer, он регулярно позицию ProgressBar-a опрашивает. Это tread-safe или нужно c CriticalSection работать?
Можно и без Critical Section.

Можно определить в thread

Код: Выделить всё

CWnd *parent]


А потом

[code]

int CMyThread :: Run(...) {

   for( .... ) {
      do_something();
      parent->PostMessage( WM_USER+1, 0, 0 );
   };

};

А в parent

Код: Выделить всё


HRESULT CMyWnd :: ProcessUserMessage( HPARAM .... ) {

    m_progress->do_something()

};

Сорри... Это для VC, но я надеюсь, у Билдера обработка событий есть.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
alexx
Сообщения: 116
Зарегистрирован: 02 июл 2004, 22:29
Откуда: Hamburg

Спасибо! То что и надо было.
-------------
Лень - двигатель прогресса!
Ответить