Форум: "Начинающим";
Текущий архив: 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 не зря волнуется.
← →
Alexander Panov © (2005-09-03 23:59) [41]Fay © (03.09.05 3:03) [39]
Выдирать фразу из контекста нехорошо. Это демагогические приемы.
Кроме того, вот эта фраза
Мастера, неужели это не бред?
Если нет, то это заoщита кода ОТ ЧЕГО?
А если бред, то где уже этот долбаный "синий карандаш"?!
говорит о том, что у тебя недостаточное понимание этой темы.
← →
Alexander Panov © (2005-09-04 00:01) [42]tesseract © (03.09.05 18:52) [40]
Я бы сказал что это защита данных от непредсказуемого изменения, в целом и fay не зря волнуется.
"..от непредсказуемого изменения..."
Вот здесь ответь, изменения кем или чем? Это и будет ответом.
"...fay не зря волнуется."
Читай [41]
← →
Fay © (2005-09-04 00:19) [43]2 Alexander Panov © (03.09.05 23:59)
Нельзя ли тогда узнать, какой был контекст? Просто не могу ничего придумать.
Подобное уже встречалось в "Как приостановить поток" - какой там контекст?
Такой-же? КАКОЙ?!
> Синхронизация - защита участка кода программы(не
> данных), использующего(читающего или модифицирующего)
> некий ресурс, обращение к которому происходит из
> нескольких потоков.
Подобная формулировка допускает разночтения? Не верю.
← →
Fay © (2005-09-04 00:20) [44]К [43]
> Вот здесь ответь, изменения кем или чем? Это и будет
> ответом.
А вот такой ответ можно понимать вАщЕ как угодно.
← →
Alexander Panov © (2005-09-04 00:21) [45]Fay © (04.09.05 0:19) [43]
Сравни 2 цитаты:
"Синхронизация - защита участка кода программы(не данных)"
и
> Синхронизация - защита участка кода программы(не
> данных), использующего(читающего или модифицирующего)
> некий ресурс, обращение к которому происходит из
> нескольких потоков.
Отличается. Верно ведь?
← →
Alexander Panov © (2005-09-04 00:22) [46]Fay © (04.09.05 0:20) [44]
А вот такой ответ можно понимать вАщЕ как угодно.
А ты ответил на этот вопрос?
← →
Alexander Panov © (2005-09-04 00:28) [47]Еще раз повторю...
Доступ к любому ресурсу возможен только "кем-то". Этот "кто-то" - кодовый поток, точнее - кусок этого кодового поока, в котором происходит обращение к ресурсу, т.е. вполне конкретный код.
Вот этот "кто-то" - это код, который необходимо включить в процесс синхронизации.
Можно назвать это защитой данных, суть от этого не изменится. Я считаю, что значительно понятнее для новичков будет суть процесса синхронизации, нежели игра словами.
← →
vidiv © (2005-09-06 05:21) [48]
> 1. Код, использующий разные ресурсы, защищается разными
> критическими секциями
> 2. Код в каждом потоке, использующий один и тот же ресурс,
> защищается одной и той же критической секцией. Эта критическая
> секция должна быть известна каждому потоку до начала использования.
Можно пояснить эти два условия?!
← →
Lamer@fools.ua © (2005-09-06 09:13) [49]>>Alexander Panov © (02.09.05 11:45) [9]
>try
CS.Enter;
finally
CS.Leave;
end;
Хороший пример того, как не надо делать. А надо так:CS.Enter;
try
// ...
finally
CS.Leave;
end;
← →
Alexander Panov © (2005-09-06 09:35) [50]Lamer@fools.ua © (06.09.05 9:13) [49]
Спасибо за поправку.
vidiv © (06.09.05 5:21) [48]
Можно пояснить эти два условия?!
Первое условие означает, что если поток использует 2 разных ресурса, то и для синхронизации нужно использовать две разных критических секции - для каждого ресурса свою.
Второе условие говорит о том, что при работе с ресурсом из двух и более потоков необходимо, чтобы в каждом потоке использовалась единственная для всех потоков критическая секция. Эта секция должна быть создана до начала использования секции и работы с ресурсом.
← →
vidiv © (2005-09-07 09:39) [51]
> Alexander Panov © (06.09.05 09:35) [50]
Переменные и объекты основного потока - это, если я правильно понял, считается одним ресурсом для остальных потоков, и для них достаточно одной крит. секции, правильно?
И вообще что может являтся ресурсом?
← →
Alexander Panov © (2005-09-07 12:17) [52]vidiv © (07.09.05 9:39) [51]
Переменные и объекты основного потока - это, если я правильно понял, считается одним ресурсом для остальных потоков,
В зависимости от логики программы.
Обращение к каждому ресурсу (в данном контексте - переменной или объекту, и их может быть несколько) может происходить в разных местах потоков, из разных функций, в разные моменты времени. Причем от того, что поток - основной, методы защиты не меняются.
Можно поступить двумя способами.
1. Создать одну критическую секцию для всех защищаемых ресурсов.
При этом при любом обращении к любому из этих ресурсов, к необходимо будет захватывать критическую секцию.
2. Для каждого ресурса создать свою критическую секцию, и захватывать ее только при обращении к этому ресурсу.
Причем защищать нужно обращение к ресурсу из каждого кодового потока, в том числе и из основного.
vidiv © (07.09.05 9:39) [51]
И вообще что может являтся ресурсом?
Ресурсом может являться любой объект, которые необходимо использовать в программе.
Начиная с ОП, заканчивая дисковой памятью и внешними устройствами.устройствами
← →
Игорь Шевченко © (2005-09-08 11:10) [53]А вот неплохая демка была на предмет синхронизации:
http://www.schevchenko.net.ru/SRC/SuperMarket_50.zip
← →
Игорь Шевченко © (2005-09-08 11:19) [54]
> Можно назвать это защитой данных, суть от этого не изменится.
> Я считаю, что значительно понятнее для новичков будет суть
> процесса синхронизации, нежели игра словами.
Для новичков - синхронизацией называется не защита данных и уж тем более, не защита кода. Синхронизацией называется упорядочение каких-либо действий, применительно к данной теме - упорядочение доступа к ресурсу, не более.
← →
Fay © (2005-09-09 01:28) [55]2 Игорь Шевченко © (08.09.05 11:19) [54]
Интересно, как звучало бы определение у спортсменов(к)-синхронистов(к). 8)
← →
Игорь Шевченко © (2005-09-09 09:58) [56]Fay © (09.09.05 01:28) [55]
> Интересно, как звучало бы определение у спортсменов(к)-синхронистов(к).
> 8
Как упорядочение действий, разумеется. Ничего нового.
← →
Fay © (2005-09-09 10:08) [57]2 Игорь Шевченко © (09.09.05 9:58) [56]
IMHO, "упорядочение действий" понятие пошире, нежели "синхронизация"
← →
Игорь Шевченко © (2005-09-09 11:03) [58]"Синхронизация
(от греч. synchronos - одновременный), приведение двух или нескольких процессов к синхроннонсти, т. е. к такому их протеканию, когда одинаковые или соответствующие элементы процессов совершаются с неизменным сдвигом по фазе друг относительно друга (например, речь оратора и переводчика при синхронном переводе) или одновременно (например, движения танцовщиц в кордебалете). С. периодических процессов достигается приведением к взаимному соответствию (например, к равенству или кратности) их периодов (частот) и установлением постоянного соотношения между их начальными фазами (постоянного взаимного сдвига фаз). Процессы, удовлетворяющие условиям синхронности, называются синхронными или синхронизированными; качество (свойство), которым они обладают, называется синхронизмом. Несинхронные процессы называются асинхронными."
← →
atruhin © (2005-09-10 20:57) [59]>>Alexander Panov © (02.09.05 11:45) [9]
>>Использовать функции синхронизации надо не только при записи, >>но и при чтении тех данных, обращение к которым происходит из >>нескольких потоков.
А я вот не соглашусь. Далеко не всегда нужно это делать. Возьмем к примеру переменную типа integer, которой присваеваем значения и читаем, обе операции атомарные на уровне процессора. Зачем их синхронизировать?
>>Без четкого понимания того, что происходит при работе с данными >>из нескольких потоков, это не имеет смысла.
Вот с этим согласен польностью
← →
Defunct © (2005-09-11 04:54) [60]> А я вот не соглашусь. Далеко не всегда нужно это делать. Возьмем к примеру переменную типа integer, которой присваеваем значения и читаем, обе операции атомарные на уровне процессора. Зачем их синхронизировать?
Возьмем другой пример.
Изменяется строка String. Начали читать, часть прочитали и тут опа какой-то умный поток пишет. И в итоге когда дочитаем получем галиматью.
Третий пример.
переменная типа integer. Допустим делаем тривиальный счетчик обращений к переменной спомощью inc(X). Поток 1 прочитал X, поток 2 прочитал X, оба потока увеличили X на 1 и пишут обратно, в результате получим при записи увеличение на 1, а не на 2 как должно было быть.
>> Без четкого понимания того, что происходит при работе с данными >>из нескольких потоков, это не имеет смысла.
> Вот с этим согласен польностью
можно и без понимания. За меня уже все продумали и предоставили механизм синхронизации. Моя задача просто использовать его. И часто даже без понимания все будет работать. (с пониманием конечно лучше). Но ведь не обязательно знать теорию электродинамики для того чтобы щелкнуть выключателем и зажегся свет.
Игорь Шевченко © (02.09.05 15:54) [19]
Знаешь, вообще-то идея переименовывать ".exe" в ".govno" к добру обычно не приводит. И коль найдется такой пользователь который начнет эксперементировать с расширениями и потом пытаться запустить то, что он намутил, так флаг ему в руки, и пусть у него все глючит. Это уже сугубо его проблема.
← →
Defunct © (2005-09-11 05:12) [61]begin...end © (02.09.05 15:45) [17]
> Любое
нет не любое. А только ".exe"
> ИШ, begin...end
Жаль нет такого смайлика, который выражает полное недоумение, несогласие с вашими постами, прозревание от прочитаного и легкое презрение, которое вызвано эмоциями от прочитанного. (С) а то бы я обязательно его поставил..
Вы рассуждаете о вседозволенности для пользователей, даже в таком вопросе как расширения исполнимых (системных) файлов. грустно.
← →
Джо © (2005-09-11 05:18) [62]Добавлю к [60] Defunct ©
Гм, гм... Ну, изменит пользователь расширение у исполнимого файла. Это даже проблем никаких не вызовет. По той простой причине, что "проблемный код", о котором речь, даже не выполнится. Ибо, умная система виндовс не научена выполнять файлы с расширением ".ovno".
← →
Fay © (2005-09-11 05:41) [63]2 Игорь Шевченко © (09.09.05 11:03) [58]
Наукообразность определения не помогает понять суть.
Так, по-моему, лучшее определение понятия "лошадь" - это "Что такое лошадь, знают все". 8)
А вот причины, по которым фраза "не защита данных и уж тем более, не защита кода" включает "и уж тем более" мне понятны, т.к. из фразы следует, что синхронизация имеео отношение к защите данных (IMHO, эта связь совершенно не маскируется).
← →
Defunct © (2005-09-11 06:16) [64]Навеяно Fay ©
позволю себе пофантазировать.
1. Синхронизация - это процесс, при котором некоторый(ые) кодовый поток ожидает возникновения события в другом(их) кодовом(ых) потоке(ах).
2. Синхронизация - это режим доступа к ресурсу, при котором кодовый поток запрашивает статус ресурса. Если ресурс свободен - захватывает ресурс, иначе - приостанавливается и ожидает пока ресурс освободится. После окончания работы с ресурсом кодовый поток освобождает занятый ресурс.
3. Синхронизация - это метод последовательного(поочередного) доступа разных кодовых потоков к одному ресурсу.
В 2,3 imho отражен принцип работы крит. секций. И защищается не код, а данные от преждевременного захвата. 1 - можно интерпретировать как SendMessage где дейстительно происходит защита кода от преждевременного исполнения.
← →
atruhin © (2005-09-11 07:42) [65]>>Defunct © (11.09.05 04:54) [60]
>> Допустим делаем тривиальный счетчик обращений к переменной >>спомощью inc(X)
Я делаю с помощью InterlockedExchangeAdd, и все ОК. :)
>>можно и без понимания. За меня уже все продумали и предоставили >>механизм синхронизации.
Вот так без понимания пишут, а потом на форум: помогите я тут, что то передрал но сам не знаю что (это не о ВАС а вообще).
Ведь не зря Windows существует немало способов синхронизации: критические секции, объекты ядра, атомарные операции. Отличаются возможностями, скоростью работы ...
Так что мое мнение, если начинаешь работать с потоками, лучше вначале досконально разобраться, а потом delphi запускать.
← →
Defunct © (2005-09-11 08:08) [66]> Так что мое мнение, если начинаешь работать с потоками, лучше вначале досконально разобраться, а потом delphi запускать.
Так можно вообще никогда Delphi не запустить.
Мое мнение несколько отличается от вашего:
Самый ценный опыт - опыт полученный в результате устранения собственных ошибок.
Чтением книг полезного опыта не добудешь (кроме опыта чтения книг).
Нет ничего страшного в том, что вначале можно допускать ошибки.
Понимание приходит только с практикой.
← →
begin...end © (2005-09-11 10:40) [67]> Alexander Panov © (02.09.05 16:13) [36]
А зачем заменять? Подойдёт любая функция, т.к. результат любой функции соответствует самому себе. Следовательно, любая функция удовлетворяет требованию в [18].
> Defunct © (11.09.05 05:12) [61]
> нет не любое.
Любое.
> Джо © (11.09.05 05:18) [62]
> "проблемный код", о котором речь, даже не выполнится
Выполнится.
> Ибо, умная система виндовс не научена выполнять файлы с
> расширением ".ovno".
Научена.
← →
Джо © (2005-09-11 15:53) [68]
> [67] begin...end © (11.09.05 10:40)
Пожалуйста, приведите последовательность действий, при помощи которой пользователь будет запускать на выполнение в файловом менеджере или там Explorer"е файлы с расширением ".ovno".
← →
begin...end © (2005-09-11 15:57) [69]> Джо © (11.09.05 15:53) [68]
Пользователь, вообще-то, может командной строкой воспользоваться. Или командой runas.
← →
Джо © (2005-09-11 16:10) [70]
> [69] begin...end © (11.09.05 15:57)
Честно говоря, не знал о таком финте. Действительно, запускается. В таком случае, действительно, проблемная ситуация может и случиться. Впрочем, все ямы которые может вырыть себе пользователь своими неумными действиями предусмотреть все-равно невозможно.
← →
Defunct © (2005-09-11 17:54) [71]begin...end © (11.09.05 10:40) [67]
>>> Любое
>> нет не любое.
> Любое.
повторять одно и то же это нынче модно так?
нет не любое. только ".exe". На любые другие расширения - плевать (они не являются гарантировано запускаемыми).
← →
begin...end © (2005-09-11 18:05) [72]> Defunct © (11.09.05 17:54) [71]
Вы хоть читайте посты, на которые отвечаете.
В [16] был вопрос от Alexander Panov: "А какое может быть еще расширение у написанного мной исполняемого файла?". Я в [17] ответил: "Любое". Вы что, сомневаетесь в том, что Alexander Panov способен изменить расширение у файла или сразу указать расширение, отличное от "exe", в настройках проекта? Если сомневаетесь, то интересно, почему. А если не сомневаетесь, то только подтверждаете мои слова, и тогда [61] и [71] не в кассу.
← →
begin...end © (2005-09-11 18:11) [73]> Defunct © (11.09.05 17:54) [71]
> На любые другие расширения - плевать (они не являются гарантировано
> запускаемыми).
Что есть "гарантированно запускаемое расширение"?
← →
Defunct © (2005-09-11 18:22) [74]begin...end © (11.09.05 18:11) [73]
> Что есть "гарантированно запускаемое расширение"?
Такое о котором в книжках по ОС, в данном случае по Windows, написано - executable file. Переименуй вы его в .JPEG или скажем в .wav результат от попыток запустить такой файл будет весьма плачевным.
← →
begin...end © (2005-09-11 18:28) [75]> Defunct © (11.09.05 18:22) [74]
> Переименуй вы его в .JPEG или скажем в .wav результат от
> попыток запустить такой файл будет весьма плачевным.
Это смотря чем запускать. Тут можно посоветовать про API-функцию CreateProcess почитать.
Если сопоставить расширению EXE какое-либо приложение (причём с помощью стандартных средств Windows), то результат попыток запустить в "Проводнике" файл с этим "гарантированно запускаемым расширением" тоже может быть весьма плачевным. Так что никакое оно не "гарантированно запускаемое".
← →
Defunct © (2005-09-11 18:38) [76]> Это смотря чем запускать. Тут можно посоветовать про API-функцию CreateProcess почитать.
программы обычно пишутся для рядового пользователя. Он не будет использовать CreateProcess, он будет использовать проводник или WinCmd (или другой файл-менеджер).
> Если сопоставить расширению EXE какое-либо приложение
После такого неопытные пользователи обычно переустанавливают виндовс.
PS: вы хотите сказать, что вообще никакой дисциплины не должно быть?
← →
begin...end © (2005-09-11 18:50) [77]> Defunct © (11.09.05 18:38) [76]
> Он не будет использовать CreateProcess, он будет использовать
> проводник или WinCmd (или другой файл-менеджер).
Напрямую использовать CreateProcess -- не будет, а косвенно -- может. См. пример в [69]. Я не считаю умение человека пользоваться командной строкой сверхъестественным.
> После такого неопытные пользователи обычно переустанавливают
> виндовс.
И что? Главное, что EXE-расширение не является "гарантированно запускаемым", вопреки сказанному Вами.
Вы про CreateProcess почитали? Там написано, что он исполняет в созданном процессе указанный модуль (executable file). Из того, что он запускает не только файлы с расширением "exe", можно заключить, что у исполняемого файла не обязательно должно быть это расширение. И что принадлежность файла к исполняемым вообще определяется здесь не по его расширению.
С таким же успехом можно было бы сказать, что файл с расширением doc -- это гарантированно word-овский документ.
> PS: вы хотите сказать, что вообще никакой дисциплины не
> должно быть?
Нет, я не хочу сказать, что вообще никакой дисциплины не должно быть.
← →
Defunct © (2005-09-11 20:52) [78]> Вы про CreateProcess почитали?
Да конечно, еще могу добавить, что команда start тоже может запустить исполнимый модуль с любым расширением. Однако, я категорически против такого "издевательства" на ОС.
> Нет, я не хочу сказать, что вообще никакой дисциплины не должно быть.
Вот и славно. Этими словами можно сказать вы разделяете мой взгляд на то, что Алексканд Панов придерживается дисциплины, а пользователь, который вдруг изменит расширение его ".exe" файла - дисциплины не придерживается. Следовательно со своей стороны Александр Панов не в ответе за возможные глюки по вине пользователя.
← →
Defunct © (2005-09-11 20:54) [79]извините, за опечатку в имени... никоим образом не хотел никого обидеть.
← →
begin...end © (2005-09-11 21:14) [80]> Defunct © (11.09.05 20:52) [78]
> Однако, я категорически против такого "издевательства" на
> ОС.
Однако непонятно, почему. И пока что никто не объяснил, почему это можно считать издевательством над ОС.
> Этими словами можно сказать вы разделяете мой взгляд на
> то, что Алексканд Панов придерживается дисциплины, а пользователь,
> который вдруг изменит расширение его ".exe" файла - дисциплины
> не придерживается.
Это не следует из сказанного мной в [77]. Я не знаю, о какой дисциплине идёт речь. А мои взгляды не изменились -- я считаю, что Александр Панов, используя функцию GetIniName из [10], поступает неправильно. И в изменении пользователем расширения исполняемого файла я не вижу ничего ненормального.
← →
Defunct © (2005-09-12 01:12) [81]> begin...end
> Однако непонятно, почему. И пока что никто не объяснил, почему это можно считать издевательством над ОС.
Тем, кто не работал в DOS, объяснить "почему" достаточно трудно. Если я ошибся в выводе относительно вашей практики работы в DOS, прошу извинить.
> Я не знаю, о какой дисциплине идёт речь.
В данном контексте речь идет о дисциплине соответствия расширения файла его типу. Ибо другого способа определения внутреннего формата файла пока нет.
> И в изменении пользователем расширения исполняемого файла я не вижу ничего ненормального.
Попробую вас переубедить. Если допустить переименование расширений файлов по принципу "от фонаря" где звуковые потоки назвать ".exe", видеопотоки - ".bmp", рисунки - ".mid" и т.п. наступит полная неразбериха и система будет не в состоянии определить, что делать с этими файлами, то ли скармливать процессору как исполнимый код, то ли скармливать какой-то программе как данные. Как следствие получим сбой в работе системы при определенных обстоятельствах.
Существует определенный общепринятый стандарт, который позволяет именно по расширению имени файла судить о его типе. Если этот стандарт по какой-то причине нарушается, то наносится вред в первую очередь пользователю, который позволил себе самовольное изменение расширения файла. Во вторую очередь (если допустить, что он распространяет файлы с заведомо неверным расширением) вредит и другим пользователям. Следовательно, произвольное изменение расширения файла наносит определенный вред (вызывает неразбериху при определении типа файла, что приводит в конечном счете к потере чьего-то времени), из чего следует, что изменение расширения исполнимого файла также наносит определенный вред. Нормальная работа системы приносит пользу. Ненормальная - вред.
Подытожив все сказанное, получим, что изменение расширения исполнимого файла - явление ненормальное, потому как наносит прямой или косвенный вред пользователям.
← →
Defunct © (2005-09-12 05:04) [82]> begin...end
Дабы вам было легче принять мою точку зрения, скажу
Мне известно следующее:
1. Как работает функция CreateProcess.
2. Как работает загрузчик ОС.
3. Внутренний формат EXE файла.
4. Far запускает EXE файл по внутреннему формату, а не по расширению.
5. Start запускает EXE файл по внутреннему формату, если не находит соответствия в базе типов-расширений.
6. Explorer запускает файл строго по расширению.
7. В коде [10] есть более серьезные ошибки, которые могут привести к deadlock"у.
8. Обсуждаемая функция не блеск, но и не ламерская.
9. SysUtils занимает доп. память.
10. ChangeFileExt не является функцией WinAPI.
11. От пользователя можно ожидать всего, но его нужно приучать к дисциплине.
12. .exe переименовывть нельзя (априори дурной тон)
13. нарушение п.12 влечет за собой возможность нарушения последующих пунктов.
14. каталог %SYSTEMROOT% удалять нельзя.
15. boot.ini удалять нельзя.
16. Своп отключать нельзя.
17. Диск форматировать нельзя.
18. Вирусы писать нельзя.
19. Пакостить нельзя.
← →
Джо © (2005-09-12 05:10) [83]20. Нельзя открывать в блокноте исполнимый файл и писать там макросы VBA (сам видел - клянусь!).
:)
← →
Наиль © (2005-09-12 08:37) [84]>[82]
> Мне известно следующее:
К сожалению этой фразой вы укрепили верность слов begin...end.
Потому как большинству не программистов, это не известно.
Из практики работы учителем, могу сказать, что большинство людей до 20 лет старается нарушить эти правила.
> Дабы вам было легче принять мою точку зрения, скажу
Уверен, что у begin...end, понимает Вашу точку зрения, но нет ничего предосудительного в его желании писать такие программы, которые продолжают работать, когда ОС уже висит.
Из своего личного опыта.
У нас в семье на троих был один компьютер. И если мне он нужен был для работы, то остальным для игр. Первым делом я стёр все игры. Но они появлялись снова. Тогда я пошёл на крайние меры. Все исполнимые программы переименовал в *.ехе (русскими буквами). Настроил их запуск и правильный показ в проводнике. А на стандартное расширение поставил запуск программы которая ругается страшными словами.
Выводы:
1. Расширение исполняемых файлов может быть отлично от exe.
2. Иногда, это делается не поглупости, а по необходимости.
← →
begin...end © (2005-09-12 08:57) [85]> Defunct © (12.09.05 01:12) [81]
> Если этот стандарт по какой-то причине нарушается, то наносится
> вред в первую очередь пользователю, который позволил себе
> самовольное изменение расширения файла.
Предположим, я переименовал расширения некоторых исполняемых файлов и запускаю их из командной строки. Они нормально запускаются. Не могу понять, какой вред будет нанесён мне в этом случае.
А если они не будут нормально запускаться и работать из-за функций типа [10] -- так это уже промах программиста. И место таких программ, как уже и было сказано -- в Recycle Bin.
> Подытожив все сказанное, получим, что изменение расширения
> исполнимого файла - явление ненормальное, потому как наносит
> прямой или косвенный вред пользователям.
Оно может нанести вред. А может и не нанести. "Всякий овощ ..." (с)
> В данном контексте речь идет о дисциплине соответствия расширения
> файла его типу. Ибо другого способа определения внутреннего
> формата файла пока нет.
> Defunct © (12.09.05 05:04) [82]
> 4. Far запускает EXE файл по внутреннему формату, а не по
> расширению.
То есть как это? В [81] Вы говорите, что внутренний формат файла (а значит, и EXE-файла) можно определить ТОЛЬКО по его расширению (что само по себе смешно, поскольку в этой ветке уже приведено много примеров обратного), а в [82] -- что Far таки определяет внутренний формат, НЕ ориентируясь на расширение файла!
Кстати, сейчас попробовал запустить EXE-файл с изменённым расширением в FAR"е -- почему-то не получилось. Может быть, объясните, почему?
> 9. SysUtils занимает доп. память.
> 10. ChangeFileExt не является функцией WinAPI.
И что? Что-то мешает написать свой правильный аналог ChangeFileExt, чтобы не использовать SysUtils?
> Мне известно следующее:
> 17. Диск форматировать нельзя.
LOL!
Извините, но [82] не облегчило понимание Вашей точки зрения. Скорее наоборот.
← →
Defunct © (2005-09-12 10:22) [86]begin...end © (12.09.05 08:57) [85]
> Кстати, сейчас попробовал запустить EXE-файл с изменённым расширением в FAR"е -- почему-то не получилось. Может быть, объясните, почему?
Объяснения может быть только одно - возможно версия старая.
> То есть как это? В [81] Вы говорите, что внутренний формат файла (а значит, и EXE-файла) можно определить ТОЛЬКО по его расширению
EXE является исключением. В [81] я говорил о любом файле, в [82] написано где определение типа ведется строго по расширению.
> Что-то мешает написать свой правильный аналог ChangeFileExt, чтобы не использовать SysUtils?
Что мешает написать свой аналог Windows чтобы не использовать продукции MicroSoft?
Могли бы и догадаться. Как всегда определяющий фактор - время.
>> 17. Диск форматировать нельзя.
>LOL!
Некоторые форматируют диск с которого загружается система, и потом спрашивают почему не запускается Ворд.
Да и вообще нет смысла форматировать.
← →
begin...end © (2005-09-12 10:44) [87]> Defunct © (12.09.05 10:22) [86]
> Объяснения может быть только одно - возможно версия старая.
Версия 1.70. У Вас более новая?
> EXE является исключением.
Похоже, не только EXE является исключением. Измените расширение у word-овского документа на любое другое, и откройте файл в Word. Измените расширение у MP3-файла, и откройте его в Windows Media Player. Возрадуйтесь интеллекту программ фирмы Microsoft.
> Что мешает написать свой аналог Windows чтобы не использовать
> продукции MicroSoft?
> Могли бы и догадаться. Как всегда определяющий фактор -
> время.
Вы это к чему вообще? В [10] не используется SysUtils, и для определения имени ini-файла написана новая функция. Могли бы и догадаться, что как раз для экономии времени лучше было бы подключить SysUtils и использовать стандартную ChangeFileExt. Если же хочется сэкономить ещё и память, то можно и свою функцию написать -- лишь бы она не была глючной.
> Да и вообще нет смысла форматировать.
Дадад. Новый винчестер купил -- и сразу, без форматирования, систему устанавливай на диск, не содержащий разделов.
← →
Игорь Шевченко © (2005-09-12 12:02) [88]исполняемые файлы с любым расширением запускаются командой start
← →
Игорь Шевченко © (2005-09-12 12:04) [89]
> 12. .exe переименовывть нельзя (априори дурной тон)
А вот фирма-разработчик Windows не видит в этом ничего дурного...
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.74 MB
Время: 0.049 c