![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потоки
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? Не возникнет ли ошибки? И как правильнее это обработать?