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

Вниз

Вопрос по потокам   Найти похожие ветки 

 
Русланка   (2005-09-01 15:48) [0]

Если у меня в главном модуле объявлены глобальные переменные, то сможет ли запущенный отдельный поток писать и читать данные из этих переменных?


 
Игорь Шевченко ©   (2005-09-01 15:55) [1]

Сможет


 
Evgeny V ©   (2005-09-01 15:57) [2]

Может. Думаю (пытаюсь угадать точнее:-)), так как не знаю вашей задачи) вам пондабится так же и синхронизировать доступ к общим переменным,если это так, то обратите на это внимание.


 
begin...end ©   (2005-09-01 15:58) [3]

> Русланка   (01.09.05 15:48)

The thread function and any of the routines it calls have their own local variables, just like any other Dephi language routines. These routines also can access any global variables. In fact, global variables provide a powerful mechanism for communicating between threads.


 
Русланка   (2005-09-01 17:41) [4]

Спасибо, поняла!


 
Руслан   (2005-09-02 09:04) [5]

Но на всякий случай используй критические секции как обрамление при записи глобальныхм переменных...


 
Alexander Panov ©   (2005-09-02 09:49) [6]

Руслан   (02.09.05 9:04) [5]

Не стоит постить неоформившиеся мысли.


 
Руслан   (2005-09-02 11:08) [7]

Alexander Panov ©   (02.09.05 09:49) [6]
Поясните мысль ?

Свой ответ я постил держа перед собой:
Чарльз Калверт "Delphi 4 Unleashed"
Часть II
Глава 7 "Мультизадачность и потоки"
"Критические разделы: Как заставить потоки работать вместе"

Жду аргументов с вашей стороны.


 
vidiv ©   (2005-09-02 11:23) [8]

А ктонибудь может привести пример синхронизации на вин-апи?


 
Alexander Panov ©   (2005-09-02 11:45) [9]

Руслан   (02.09.05 11:08) [7]
Жду аргументов с вашей стороны.


Аргументов чего?
Прочитай внимательно свой пост [5] и попытаяся высянить без Рихтера, что в нем написано.

Руслан   (02.09.05 9:04) [5]
Но на всякий случай используй критические секции как обрамление при записи глобальныхм переменных...


Не надо использовать критические секции "на всякий случай".
Без четкого понимания того, что происходит при работе с данными из нескольких потоков, это не имеет смысла.

Использовать функции синхронизации надо не только при записи, но и при чтении тех данных, обращение к которым происходит из нескольких потоков.

Синхронизация - защита участка кода программы(не данных), использующего(читающего или модифицирующего) некий ресурс, обращение к которому происходит из нескольких потоков.

Синхронизация возможна многими способами.
Наиболее применяемый - критические секции.
для применения критических секций должны выполняться условия:

1. Код, использующий разные ресурсы, защищается разными критическими секциями
2. Код в каждом потоке, использующий один и тот же ресурс, защищается одной и той же критической секцией. Эта критическая секция должна быть известна каждому потоку до начала использования.
3. Для того, чтобы обеспечить гарантированное освобождение ресурса после использования, необходимо применять конструкцию вида

  try
     CS.Enter;
  finally
     CS.Leave;
  end;


 
Alexander Panov ©   (2005-09-02 11:47) [10]

vidiv ©   (02.09.05 11:23) [8]
А ктонибудь может привести пример синхронизации на вин-апи?


unit uIni;

interface

uses
 windows,IniFiles;

 procedure EnterIniCS;
 procedure LeaveIniCS;
 function GetIniName: String;
 function GetParm(const aSec,aParm: String): String;
 procedure WriteParm(const aSec,aParm,aValue: String);
 procedure DeleteSection(const aSec: String);
 procedure DeleteKey(const aSec,aParm: String);

var
 IniCS: RTL_CRITICAL_SECTION;

implementation

procedure EnterIniCS;
begin
 EnterCriticalSection(IniCS);
end;

procedure LeaveIniCS;
begin
 LeaveCriticalSection(IniCS);
end;

function GetIniName: String;
begin
 Result := ParamStr(0);
 SetLength(Result,Length(Result)-3);
 Result := Result +"ini";
end;

function GetParm(const aSec,aParm: String): String;
var
 ini: TIniFIle;
begin
 Result := "";
 ini := TIniFile.Create(GetIniName);
 try
   EnterIniCS;
   Result := ini.ReadString(aSec,aParm,"");
   LeaveIniCS;
 finally
   ini.Free;
 end;
end;

procedure WriteParm(const aSec,aParm,aValue: String);
var
 ini: TIniFIle;
begin
 ini := TIniFile.Create(GetIniName);
 try
   EnterIniCS;
   ini.WriteString(aSec,aParm,aValue);
   LeaveIniCS;
 finally
   ini.Free;
 end;
end;

procedure DeleteKey(const aSec,aParm: String);
var
 ini: TIniFIle;
begin
 ini := TIniFile.Create(GetIniName);
 try
   EnterIniCS;
   ini.DeleteKey(aSec,aParm);
   LeaveIniCS;
 finally
   ini.Free;
 end;
end;

procedure DeleteSection(const aSec: String);
var
 ini: TIniFIle;
begin
 ini := TIniFile.Create(GetIniName);
 try
   EnterIniCS;
   ini.EraseSection(aSec);
   LeaveIniCS;
 finally
   ini.Free;
 end;
end;

initialization
 InitializeCriticalSection(iniCS);
finalization
 DeleteCriticalSection(iniCS);
end.


 
Игорь Шевченко ©   (2005-09-02 13:27) [11]


> function GetIniName: String;
> begin
>  Result := ParamStr(0);
>  SetLength(Result,Length(Result)-3);
>  Result := Result +"ini";
> end;


Result := ChangeFileExit (ParamStr(0), ".ini");


 
Alexander Panov ©   (2005-09-02 13:37) [12]

Игорь Шевченко ©   (02.09.05 13:27) [11]

Это было изначально в другом модуле - только на WinAPI без подключения Sysutils.


 
Игорь Шевченко ©   (2005-09-02 14:04) [13]

Alexander Panov ©   (02.09.05 13:37) [12]

Это было изначально неправильно. А ChangeFileExt работает правильно.


 
Alexander Panov ©   (2005-09-02 14:36) [14]

Игорь Шевченко ©   (02.09.05 14:04) [13]
Это было изначально неправильно.


Поясни?


 
Игорь Шевченко ©   (2005-09-02 15:38) [15]

Alexander Panov ©   (02.09.05 14:36) [14]

Поясняю. Размер расширения исполняемого файла не обязательно равен 3-м символам.


 
Alexander Panov ©   (2005-09-02 15:39) [16]

Игорь Шевченко ©   (02.09.05 15:38) [15]
Поясняю. Размер расширения исполняемого файла не обязательно равен 3-м символам.


А какое может быть еще расширение у написанного мной исполняемого файла?


 
begin...end ©   (2005-09-02 15:45) [17]

> Alexander Panov ©   (02.09.05 15:39) [16]

Любое.


 
Alexander Panov ©   (2005-09-02 15:52) [18]

begin...end ©   (02.09.05 15:45) [17]
Любое.


Значит, имя ini-файла будет соответствующее.
Но вот Это было изначально неправильно. - в упор не вижу


 
Игорь Шевченко ©   (2005-09-02 15:54) [19]

Alexander Panov ©   (02.09.05 15:52) [18]

Я считаю, что в конференции для начинающих не стоит приводить фрагменты кода, являющиеся источником потенциальных глюков.

Попробуй сделать файлу расширение из одного символа. Или из нуля.


 
Alexander Panov ©   (2005-09-02 15:57) [20]

Игорь Шевченко ©   (02.09.05 15:54) [19]
Попробуй сделать файлу расширение из одного символа. Или из нуля.


и?


 
begin...end ©   (2005-09-02 15:58) [21]

> Alexander Panov ©   (02.09.05 15:52) [18]
> Значит, имя ini-файла будет соответствующее.

Чему соответствующее? Исполняемый файл: "Project.1", ini-файл: "Projecini". Что чему соответствует?


 
Игорь Шевченко ©   (2005-09-02 16:01) [22]

Alexander Panov ©   (02.09.05 15:57) [20]

Попробуй.


 
Alexander Panov ©   (2005-09-02 16:01) [23]

begin...end ©   (02.09.05 15:58) [21]
Чему соответствующее? Исполняемый файл: "Project.1", ini-файл: "Projecini". Что чему соответствует?


"Projecini" - неправильное имя?


 
Alexander Panov ©   (2005-09-02 16:02) [24]

Игорь Шевченко ©   (02.09.05 16:01) [22]
Попробуй.


А зачем пробовать? и так видно, что получаемое имя будет легальным.

Елинственный недочет - не учитывается общая длина имени файла, которая не может быть меньше 4.


 
Игорь Шевченко ©   (2005-09-02 16:03) [25]

Alexander Panov ©   (02.09.05 16:01) [23]


> "Projecini" - неправильное имя?


Вопрос только, чему оно соответствует.


 
begin...end ©   (2005-09-02 16:04) [26]

> Alexander Panov ©   (02.09.05 16:01) [23]

У меня вопрос, аналогичный [25].


 
Alexander Panov ©   (2005-09-02 16:04) [27]

Игорь Шевченко ©   (02.09.05 16:03) [25]
Вопрос только, чему оно соответствует.


А чему оно должно соответствовать?


 
Alexander Panov ©   (2005-09-02 16:05) [28]

Если вы имеете ввиду, что я употребил слово "соответствующий", так все верно. Имя файла будет соответствовать тому, которое должно получиться в результате работы функции. И не более того.


 
Игорь Шевченко ©   (2005-09-02 16:05) [29]

Alexander Panov ©   (02.09.05 16:04) [27]


> А чему оно должно соответствовать?


Про соответствие ты начал, вообще-то.
Я еще раз выскажу мысль, что не стоит в форуме для начинающих выкладывать код, потенциально ведущий к глюкам.


 
begin...end ©   (2005-09-02 16:08) [30]

> Alexander Panov ©   (02.09.05 16:05) [28]

> Имя файла будет соответствовать тому, которое должно получиться
> в результате работы функции.

Говоря более простым языком, результат функции будет равен результату функции. Так?


 
Alexander Panov ©   (2005-09-02 16:09) [31]

begin...end ©   (02.09.05 16:08) [30]
Говоря более простым языком, результат функции будет равен результату функции. Так?


Естественно, именно так.


 
Alexander Panov ©   (2005-09-02 16:10) [32]

begin...end ©   (02.09.05 16:08) [30]
Кроме того, использование этой функции вообще не может повредить ничему(с учетом[24])


 
Игорь Шевченко ©   (2005-09-02 16:11) [33]

Alexander Panov ©   (02.09.05 16:09) [31]

В корзину такие функции. Пользователю по барабану, что там программист понаписал, руководствуясь каким соображениями.


 
Alexander Panov ©   (2005-09-02 16:12) [34]

Игорь Шевченко ©   (02.09.05 16:11) [33]
В корзину такие функции.


Функция нерабочая?


 
begin...end ©   (2005-09-02 16:12) [35]

> Alexander Panov ©   (02.09.05 16:09) [31]

Это была удивительно информативная мысль.


 
Alexander Panov ©   (2005-09-02 16:13) [36]

Тогда заменим на такую и все.

function GetIniName: String;
begin
Result := ParamStr(0)+"ini";
end;


И мучиться не будем.


 
Игорь Шевченко ©   (2005-09-02 16:17) [37]

Alexander Panov ©   (02.09.05 16:12) [34]


> Функция нерабочая?


А что подразумевается под "рабочей" функцией ?


 
Dok_3D ©   (2005-09-03 00:07) [38]

:)


 
Fay ©   (2005-09-03 03:03) [39]

Я уже второй раз вижу заявление вида "Синхронизация - защита участка кода программы(не данных)" (оба раза автором был Alexander Panov).

Мастера, неужели это не бред?
Если нет, то это заoщита кода ОТ ЧЕГО?
А если бред, то где уже этот долбаный "синий карандаш"?!


 
tesseract ©   (2005-09-03 18:52) [40]

>>Синхронизация - защита участка кода программы(не данных), >>использующего(читающего или модифицирующего) некий ресурс, >>обращение к которому происходит из нескольких потоков.

Я бы сказал что это защита данных от непредсказуемого изменения, в целом и fay не зря волнуется.



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

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

Наверх





Память: 0.55 MB
Время: 0.044 c
14-1127409500
Мексиканец
2005-09-22 21:18
2005.10.16
Кино Митрофанова


1-1127739413
MakedoneZ
2005-09-26 16:56
2005.10.16
Работа с реестром,запуск проги при старте OC


14-1126879521
TohaNik
2005-09-16 18:05
2005.10.16
Лукашенко резко критикует деятельность ООН и политику США


5-1103129104
Anatoly
2004-12-15 19:45
2005.10.16
Коллекция после запуска пустая


11-1101233858
Alex-
2004-11-23 21:17
2005.10.16
Сдвиг TKolImageShow ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский