Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Потоки


Strate ©   (2007-01-17 16:34:00) 

Здравствуйте Мастера. Такой вопрос:

Имеется два экземляра потока TThread

имеется процедура:

procedure TMyThread.Execute
begin

 if {условие} then
   DoTheTask;
end;

И процедура DoTheTask:

procedure DoTheTask;
begin
 GlobalVar := GlobalVar+1;
end;

Для каждого экземпляра {условие} зависит от многих факторов и они независимы.
Но возможен вариант когда {условие} выполнится


evvcom   (2007-01-18 09:43:00) [1]

> [11] icWasya ©   (18.01.07 09:35)

Ну если только +-1, то да с некоторыми ограничениями.


icWasya   (2007-01-18 09:35:00) [2]

есть еще InterlockedIncrement / InterlockedDecrement


evvcom   (2007-01-18 08:35:00) [3]

> [9] гостъ   (17.01.07 17:35)
> тем более, что я ссылаюсь на код из Дельфи - Classes

И что? Если код из Classes, то уже и не под виндой работаешь? Принципы-то все равно виндовые остаются, в Classes ничего сверхестественного не написано.


гостъ   (2007-01-17 17:35:00) [4]

Хммм... ну советы про Рихтера уже были... ;)
тем более, что я ссылаюсь на код из Дельфи - Classes.


evvcom   (2007-01-17 17:21:00) [5]

> [7] гостъ   (17.01.07 17:15)
> Примеры работы в Classes, правда

Ему бы лучше книжки почитать, примеры разобрать, а так сейчас скопирует опять бездумно в свой проект, и посыпятся опять вопросы "почему".


гостъ   (2007-01-17 17:15:00) [6]


> В каком порядке выполнится DoTheTask?

В том порядке, в котором на данный момент времени, какой поток выполнялся. Т.е. однозначного ответа нет.
--------------

Класс TCriticalSection - unit SyncObjs
Примеры работы в Classes, правда Борланд там, как всегда пользуется Виндовыми средствами, а именно структурой RTLCriticalSection, дельфиный класс это обертка над ней, но тем не менее... Как раз синхронизация потоков, при обращении к VCL WinControl-ам, использует критическую секцию.


var
 g_csGlobalVar : TCriticalSection;

procedure DoTheTask;
begin
 g_csGlobalVar.Enter;

 GlobalVar := GlobalVar+1;

 g_csGlobalVar.Leave;
end;

initialization
 g_csGlobalVar := TCriticalSection.Create;  

finalization
 g_csGlobalVar.Free;


Сергей М.   (2007-01-17 17:04:00) [7]


> В каком порядке выполнится DoTheTask?


"Кто первый встал, того и тапки" (С) Н.Фоменко, aka "лохматое чудовище"


evvcom   (2007-01-17 16:58:00) [8]

> [4] Strate ©   (17.01.07 16:48)
> А можно попродробнее?

Про это можно книгу написать. И уже много написано. Недавно здесь выкладывали ссылку на Джефри Рихтера "Windows для профессионалов", поищи, почитай. Если с английским все в порядке, можешь и в хелпе win32.hlp это поискать. См. CriticalSection.


Strate   (2007-01-17 16:48:00) [9]

evvcom ©   (17.01.07 16:42) [2]
> В каком порядке выполнится DoTheTask?

После if {условие}


Ну это понятно, но по идее оно 2 раза должно увеличится.

> Синхронизировать потоки, например, с помощью критических секций.

А можно попродробнее?


Strate   (2007-01-17 16:46:00) [10]

Забыл пояснить что для каждого потока уловие не одно и то же, а разное. Т.е. в большинстве случаев для одного потока будет true, а для второго false. И наоборот. Либо оба в false. Варииант в с двумя true имеет очень малую вероятность возникновения.


evvcom   (2007-01-17 16:42:00) [11]

> В каком порядке выполнится DoTheTask?

После if {условие}

> что будет с GlobalVar

Ее значение, возможно,увеличится.

> Не возникнет ли ошибки

Какой? Ошибки рантайм от этого точно не будет. А вот логическая имеется.

> И как правильнее это обработать?

Синхронизировать потоки, например, с помощью критических секций.


Strate   (2007-01-17 16:37:00) [12]

Клиент проглючило :(
Ещё раз:

процедура

procedure TMyThread.Execute
begin
while true do
if {условие} then
  DoTheTask;
end;

procedure DoTheTask;
begin
GlobalVar := GlobalVar+1;
end;

Условие зависит от многих факторов и в каждый момент времени разное.
Но возможео вариант что в один момент времени {условие} для обоих потоков станет = true.

В каком порядке выполнится DoTheTask? И что будет с GlobalVar? Не возникнет ли ошибки? И как правильнее это обработать?


Наверх

Титульная страница Поиск, карта сайта Написать письмо