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

Вниз

Многопоточность и Delphi   Найти похожие ветки 

 
Экс-Оригинал   (2008-04-26 22:53) [80]


> На ум приходит только одно: потоковая функция расположена
> в другом модуле.


т.е.?


 
Пробегал2...   (2008-04-27 12:32) [81]

Игорь Шевченко ©   (26.04.08 11:02) [74]
Давайте все-таки различать - возможно/невозможно и удобно/неудобно


а процитируйте хоть одно мое слово, где я говорю, что это невозможно?

На протяжении всей ветки я говорил, что это НЕПРАВИЛЬНО, а не невозможно. С точки зрения логики путанно. Поэтому в моих проектах и я уверен в ваших такого нету.

И не понимаю почему вы начинаете спорить, а потом зачем-то говорите про различие слов невозможно и неудобно, очевидно с самого начала говорили про неудобно.


 
Игорь Шевченко ©   (2008-04-27 12:35) [82]

Пробегал2...   (27.04.08 12:32) [81]


> На протяжении всей ветки я говорил, что это НЕПРАВИЛЬНО,
>  а не невозможно


Что есть НЕПРАВИЛЬНО ? Ты, прежде чем претендовать на абсолютную истину, определись с терминологией.
А то как в детском саду - "а я имел в виду другое!"


 
Пробегал2...   (2008-04-27 13:00) [83]

Игорь Шевченко ©   (27.04.08 12:35) [82]
Что есть НЕПРАВИЛЬНО ?


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

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


 
Игорь Шевченко ©   (2008-04-27 13:29) [84]

Пробегал2...   (27.04.08 13:00) [83]

Насчет "работать не будет правильно" - если система позволяет, почему не будет работать ?


> Я имел в виду неправильно с той точки зрения, что так делать
> не принято, то есть плохой подход


А если не секрет, где есть свод правил, где однозначно написано, как принято делать, как не принято, что есть плохой подход, что есть хороший подход ?
То есть, я понимаю, что Дейкстра сказал "goto considered harmful" и это занесено на скрижали. Так вот, есть такие же скрижали относительно потоков в DLL ?

Я до сих пор считал, если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование.


 
Сергей М,   (2008-04-27 13:39) [85]


> Экс-Оригинал   (26.04.08 22:53) [80]


> т.е.?


Что не понятно ?


 
Экс-Оригинал   (2008-04-27 13:45) [86]


> Что не понятно ?


Непонятно, что имеется ввиду. Что за другой  модуль?


 
Сергей М,   (2008-04-27 13:53) [87]


> Что за другой  модуль?


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


 
Экс-Оригинал   (2008-04-27 15:26) [88]


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


Да, действительно получается. Но только в случае CreateThread.
При использовании BeginThread - AV.


 
Сергей М,   (2008-04-27 15:34) [89]


> Экс-Оригинал   (27.04.08 15:26) [88]



> При использовании BeginThread - AV


И это вполне объяснимо.
Различия этих ф-ций надо знать как отче наш.


 
MetalFan ©   (2008-04-27 15:43) [90]

можно и мои 5 копеек!
1. цитата из MSDN по поводу DLLMain
Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result.
откуда можно сделать вывод, что управлять другими потоками (создавать при DLL_PROCESS_ATTACH и убивать при DLL_PROCESS_DEATTACH) не стоит.
откуда можно сделать вывод, что для очистки ресурсов, занятых из DLL, стоит предусмотреть отдельную функцию и вызывать ее "снаружи" перед выгрузкой библиотеки....

> procedure DLLEntryPoint(Reason: DWORD);
> begin
>  case Reason:
>    Dll_Process_Attach: ДЕЛАЕМ ИНИЦИАЛИЗАЦИЮ БИБЛИОТЕКИ
>    DLL_PROCESS_DETACH: ДЕЛАЕМ ФИНАЛИЗАЦИЮ ВСЕХ ДАННЫХ БИБЛИОТЕКИ
>  end;
> end;

делать инициализацию и финализацию надо с большой осторожностью, ибо опять же судя по библии мсдн:
Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized.


 
Сергей М,   (2008-04-27 16:47) [91]


> Экс-Оригинал   (27.04.08 15:26) [88]


Ф-ция BeginThread принимает параметром адрес функции ThreadFunc , не являющейся поточной.
Поточная функция применительно к BeginThread - это раппер в коде юнита system, а не та самая ThreadFunc.


 
Пробегал2...   (2008-04-28 00:31) [92]

Игорь Шевченко ©   (27.04.08 13:29) [84]

я не хочу спорить, ибо считаю что вы прекрасно понимаете о чем идет речь, но почему-то решили поспорить. Спор ради спора для того чтобы поиздеваться, видимо?

Поэтому я и предложил самое простое - вопрос "а вы так когда-нибудь делали?". Я уверен, что с потоками вы работали ОЧЕНЬ МНОГО, вы хоть раз применяли такую тактику, как создание в одной DLL, а завершение потока в другой DLL? Я думаю нет у вас такого кода.

Я думаю если завести тему на форуме и спросить форумчан - ни у кого не будет такого кода. Да, это мне мнение и я думаю так. И для меня это уже что-то да значит, это и логически неудобным кажется и плюс не знаю кто бы так делал. Поэтому буду считать, что так делать некошерно и спорить на эту тему не намерен.


 
Пробегал2...   (2008-04-28 00:34) [93]

Игорь Шевченко ©   (27.04.08 13:29) [84]
Я до сих пор считал, если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование


право на существование понятие относительное. Элементарный пример:

procedure TForm1.SomeMethod(...);
begin
 if Form1.blabla ...
end;


можно ли так писать? Можно.
Встретишь ли такой код у профессионала? Не встретишь.

И доказывать это я смысла не вижу. Вы упираетесь мол так делать можно. Да, можно, с этим никто не спорит, но этой если угодно плохой подход.


 
Игорь Шевченко ©   (2008-04-28 00:39) [94]

Пробегал2...   (28.04.08 00:34) [93]


> право на существование понятие относительное. Элементарный
> пример:
>
> procedure TForm1.SomeMethod(...);
> begin
>  if Form1.blabla ...
> end;
>
> можно ли так писать? Можно.
> Встретишь ли такой код у профессионала? Не встретишь.


Не надо сравнивать кислое и мягкое. Это плохой прием в дискуссии.

Пробегал2...   (28.04.08 00:31) [92]


> Поэтому буду считать, что так делать некошерно


Мы все-таки на форуме delphimaster.ru, а не в синагоге и разговор у нас идет не о толковании торы, верно ?

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


 
Пробегал2...   (2008-04-28 01:25) [95]

Игорь Шевченко ©   (28.04.08 0:39) [94]
Не надо сравнивать кислое и мягкое. Это плохой прием в дискуссии


тогда поясните, чем код:

procedure TForm1.SomeMethod(...);
begin
if Form1.blabla ...
end;


не удовлетворяет фабуле: "Я до сих пор считал, если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование"


 
Игорь Шевченко ©   (2008-04-28 09:56) [96]

Пробегал2...   (28.04.08 01:25) [95]

А что, приведенный тобой код не работает ?

Но мы отвлеклись от темы - на вопрос о том, делал ли именно я в своих проектах поток внутри одной DLL, завершающийся вне ее, отвечаю - не делал, так как не возникало подобной нужды. Возникнет - тогда продолжим дискуссию.
Относительно выделения памяти в одном месте, и работы с ней, включая освобождение, в другом - и сам делал и видел в других приложениях.


 
Пробегал2...   (2008-04-28 12:44) [97]

Игорь Шевченко ©   (28.04.08 9:56) [96]
А что, приведенный тобой код не работает ?


э-э-э... так в том и дело, что работает. Также как завершение потока работает в другом модуле.

Игорь, вы суть дискуссии помните? Мы сначала говорили о заершении потока в другом модуле, потом я вам привел пример из [95], вы сказали что это совершенно другой случай.

Я и прошу объяснить, почему это совершенно другой случай? Он ведь работает? Как раз работает. Система (в данном случае delphi) позволяет писать такой код? Позволяет.

По вашему же утверждению:

"если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование"

Так в чем разность примеров?


 
Игорь Шевченко ©   (2008-04-28 12:48) [98]

Пробегал2...   (28.04.08 12:44) [97]

Ты путаешь кислое с мягким. Код в [95] работает. К завершению потоков в другом модуле не имеет ни малейшего отношения. Твои религиозные предпочтения я не вижу никакого смысла обсуждать.


 
Пробегал2...   (2008-04-28 13:29) [99]

Игорь Шевченко ©   (28.04.08 12:48) [98]
Код в [95] работает


Код, который будет вызывать CreateThread в одной DLL, а ExitThread делать в другой DLL тоже будет работать.


 
Игорь Шевченко ©   (2008-04-28 13:40) [100]

Пробегал2...   (28.04.08 13:29) [99]

Наконец мы пришли к согласию. На этой радостной ноте можно завершить дискуссию ?


 
Пробегал2...   (2008-04-28 16:23) [101]

Игорь Шевченко ©   (28.04.08 13:40) [100]
Наконец мы пришли к согласию


почему пришли? Я как понял вы читали мои посты крайне невнимательно, по диагонали. Если вдруг перепрочтете (ну вдруг оказия такая случится) - можете подтвердить, что ни я ни вы обратного абсолютно нигде не утверждали. То есть, это не "пришли", эти постулаты были изначально озвучены и разговор был совершенно о другом.

Удивляет невнимательность и какая-то прямота процесса.

Я специально выдумал некорректный пример программирования, но чтобы он был рабочим (таким же рабочим как и завершение потока в другом модуле). На что вы мне отвечаете:

"А что, приведенный тобой код не работает ?"

Получилось что-то вроде такого:

- говорить "рок против наркотиков" тоже самое, что "гринпис против деревьев"
- но ведь гринпис любит деревья!


После этого хоть стой хоть падай. То ли человек не понял смысла первой фразы, то ли прочитал за 0,1 секунду и даже осмыслить не успев, выдал ответ.


 
Сергей М. ©   (2008-04-28 16:33) [102]


> Пробегал2...   (28.04.08 13:29) [99]
>
> Код, который будет вызывать CreateThread в одной DLL, а
> ExitThread делать в другой DLL тоже будет работать


Может и будет, но не обязан.


 
Игорь Шевченко ©   (2008-04-28 16:34) [103]

Пробегал2...   (28.04.08 16:23) [101]

Ввиду моей неоспоримой правоты дальнейшую дискуссию считаю нецелесообразной.


 
Пробегал2...   (2008-04-28 16:35) [104]

впрочем, могу выдать и другую версию, более эмоциональную, иногда так понятнее:

Игорь Шевченко ©   (28.04.08 9:56) [96]
А что, приведенный тобой код не работает ?


он как раз, блин, работает. Я специально его придумывал, чтобы он был рабочим. Чтобы он был "неправильным", но рабочим. Чтобы этот код полностью удовлетворял вашей фразе:

"если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование"

Так вот делфьи позволяет писать такой код, но это не значит что такой код стоит писать. Это называется А-Н-А-Л-О-Г-И-Я, я его привел как пример аналогичный примеру завершения потока в другом модуле. Да, windows позволяет так делать, но это не означает что так делать правильно! И с этой точки зрения я вас три раза попросил объяснить в чем РАЗНИЦА между этими примерами.

Вы три раза повторили "не путай кислое с мягким". Я понимаю, что эта фраза вам очень по душе, но я понял с первого раза и в дальнейшем просил ОБЪЯСНИТЬ различие этих примеров. Но вы ни слова ни сказали про то, чем они отличаются. Вы только повторяли "это - кислое", а "это - мягкое".

Но я не вижу разницы. Эти оба примера рабочих, в первом случае так позволяет делать windows, во втором случае так позволяет делать delphi. И то, что система позволяет так делать НЕ означает что так делать правильно.

И еще раз. Пример с кодом:

procedure TForm1.SomeMethod(...);
begin
 if Form1.blabla ...
end;


специально был предоставлен как ОПРОВЕРЖЕНИЕ фразы "если система позволяет нечто сделать, то вне зависимости от личных приверженностей, это нечто имеет право на существование". Потому что этот пример:

1) полностью рабочий и более того в простенькой программе будет идентичен правильному аналогу "Self.blabla...".

А значит этот пример полностью удовлетворяет условию изречения: "если система позволяет нечто сделать" - система ПОЗВОЛЯЕТ ТАК ДЕЛАТЬ, потому что пример - РАБОЧИЙ.

2) у профессиональных программистов рука не поднимется сказать, что так писать правильно или даже такой код имеет право на существование. Если человек понимает что он делает - он так писать НЕ БУДЕТ.

Поэтому данный пример опровергает ваше изречение. Потенциальная возможность что-то делать не означает, что так делать ПРАВИЛЬНО.

Ну так понятнее?


 
Пробегал2...   (2008-04-28 16:39) [105]

Сергей М. ©   (28.04.08 16:33) [102]
Может и будет, но не обязан


АБСОЛЮТНО ТОЧНО ТАКЖЕ пример с:

procedure TForm1.SomeMethod(...);
begin
if Form1.blabla ...
end;


может и будет рабочим. Но не обязан. Не согласен?

Вот ты сейчас какой-то критерий вывел "код может быть рабочим, а может и нет". Но это точно также относится к моему примеру.

Поэтому я и называю этот пример аналогичным, а ИШ не согласен, считая что это совершенно типа разные примеры. На вопрос "чем они разные" и почему их нельзя считать аналогичными ответа озвучено не было, хотя вопрос такой задан неоднократно. Только как молитва "ты путаешь кислое с мягким", но никакого пояснения.

Игорь Шевченко ©   (28.04.08 16:34) [103]

Ввиду моей неоспоримой правоты дальнейшую дискуссию считаю нецелесообразной


ну как вам считать - это ваше личное право. Как угодно ;)



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

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

Наверх





Память: 0.66 MB
Время: 0.052 c
2-1211044712
lewka-serdceed
2008-05-17 21:18
2008.06.08
Нажатие на Enter


2-1210756124
WebSQLNeederr
2008-05-14 13:08
2008.06.08
Как сделать что бы можно было копировать ячейки СтригГрида?


2-1210741269
noviceman
2008-05-14 09:01
2008.06.08
Уничтожение объекта из "своего" события.


15-1209196391
Kolan
2008-04-26 11:53
2008.06.08
Как создать такую (см. каритнку) форму в InnoSetup?


15-1209148434
Res
2008-04-25 22:33
2008.06.08
http протокол





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