Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];

Вниз

Потоки   Найти похожие ветки 

 
Strate ©   (2007-01-17 16:34) [0]

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

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

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

procedure TMyThread.Execute
begin

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

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

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

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


 
Strate ©   (2007-01-17 16:37) [1]

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

процедура

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

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

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

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


 
evvcom ©   (2007-01-17 16:42) [2]

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

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

> что будет с GlobalVar

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

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

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

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

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


 
Strate ©   (2007-01-17 16:46) [3]

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


 
Strate ©   (2007-01-17 16:48) [4]

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

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


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

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

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


 
evvcom ©   (2007-01-17 16:58) [5]

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

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


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


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


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


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


> В каком порядке выполнится 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;


 
evvcom ©   (2007-01-17 17:21) [8]

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

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


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

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


 
evvcom ©   (2007-01-18 08:35) [10]

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

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


 
icWasya ©   (2007-01-18 09:35) [11]

есть еще InterlockedIncrement / InterlockedDecrement


 
evvcom ©   (2007-01-18 09:43) [12]

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.045 c
2-1172080442
Lonix
2007-02-21 20:54
2007.03.11
Значок на форме окна


3-1166012418
Sinus
2006-12-13 15:20
2007.03.11
неверный пароль


15-1171518389
TUser
2007-02-15 08:46
2007.03.11
Хранение ссылок на сайты


15-1171367667
Qdesnic
2007-02-13 14:54
2007.03.11
реляционная связь


4-1162379591
novill
2006-11-01 14:13
2007.03.11
Можно ли отличить нажали цифру(плюс, enter...) на доп. клавиатуре





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский