Форум: "Начинающим";
Текущий архив: 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.036 c