![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL и поток
Бакук © (2007-12-18 10:24:00)Поток и ДЛЛ
TT = class(TThread)
protected
AMessage: PChar;
procedure Execute; override;
end;
procedure TT.Execute;
var
FResult: integer;
begin
ShowInformation('Старт');
ShowInformation('Запускл DLL');
// Func функция из DLL. Статика
FResult := Func( );
ShowInformation('Запуск DLL завершен');
ShowInformation('Результат функции: ' + IntToStr(FResult));
ShowInformation('Все, поток отработал');
end;
procedure ShowInformation(AMessage: string);
begin
frmMain.LogMemo.Lines.Append(DateTimeToStr(Now) + '. ' + AMessage);
end;
На одном компьютере выводятся сообщения:
18.12.2007 17:20:44. Старт
18.12.2007 17:20:44. Запуск DLL
18.12.2007 17:20:46. Запуск DLL завершен
18.12.2007 17:20:46. Результат функции: 22
18.12.2007 17:20:46. Все, поток отработал
На другом же
18.12.2007 17:10:46. Старт
18.12.2007 17:10:46.
18.12.2007 17:10:46. Запуск DLL
И все. Притом что функция в DLL отрабатывает максимум за минуту. Компьютер удаленный, debug произвести не могу
Какие могут быть причины?
Leonid Troyanovsky (2007-12-18 19:18:00) [1]
> Anatoly Podgoretsky © (18.12.07 16:22) [28]
> Уже в прошлом.
Forever :)
--
Regards, LVT.
Leonid Troyanovsky (2007-12-18 19:15:00) [2]
> Kolan © (18.12.07 16:24) [29]
> А самое обидное что разница в несколько строк:
Для библиотеки разница может быть и более.
Бо, даже применимость Synchronize д.б. тщательно обоснована.
IMHO, перед нами очередной клиент BadTips.
--
Regards, LVT.
Сергей М. (2007-12-18 16:28:00) [3]
> Бакук © (18.12.07 16:20) [27]
Ну продолжай в том же духе.
Kolan (2007-12-18 16:24:00) [4]> Я ответил постом выше )))))
А самое обидное что разница в несколько строк:
type
TMyThread = class(TThread)
private
FMessage: string;
protected
procedure Execute; override;
procedure DoSendInformation;
end;
TForm1 = class(TForm)
Button1: TButton;
LogMemo: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ShowInformation(AMessage: string);
begin
Form1.LogMemo.Lines.Append(DateTimeToStr(Now) + '. ' + AMessage);
end;
procedure TMyThread.Execute;
begin
FMessage := 'thread work';
Synchonize(DoSendInformation);
end;
procedure TMyThread.DoSendInformation;
begin
ShowInformation( FMessage);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(false);
end;
ЗЫ
Странно а почему ShowInformation не событие потока ?
Anatoly Podgoretsky (2007-12-18 16:22:00) [5]> Сергей М. (18.12.2007 16:18:26) [26]
Уже в прошлом.
Бакук (2007-12-18 16:20:00) [6]
> Какого же лешего ты их не выполняешь ?
Я ответил постом выше )))))
Сергей М. (2007-12-18 16:18:00) [7]
> Бакук © (18.12.07 16:08) [23]
> я конечно знаю про рекомендации
Какого же лешего ты их не выполняешь ?
> "граблями по лбу" не выхватывал
У тебя все еще впереди)
Бакук (2007-12-18 16:17:00) [8]
> Ох, аж мурашки по коже… Сколько кода с потенциально опасным
> кодом… Страшно…
Да, я ламер ))))
Kolan (2007-12-18 16:11:00) [9]> Ну я конечно знаю про рекомендации не работать с VCL-Visual,
> однако пишу уже 3 года подобным образом.
Ох, аж мурашки по коже Сколько кода с потенциально опасным кодом Страшно
Бакук (2007-12-18 16:08:00) [10]Ну я конечно знаю про рекомендации не работать с VCL-Visual, однако пишу уже 3 года подобным образом. И "граблями по лбу" не выхватывал, поэтому решил спросить у вас )
Сергей М. (2007-12-18 15:54:00) [11]
> Бакук © (18.12.07 15:46) [21]
Ну нельзя так делать, понимаешь или нет ?
Так карта легла - сегодня работает, а завтра теми же граблями по тому же лбу)
Бакук (2007-12-18 15:46:00) [12]Уважаемый Сергей М. Почему тогда работает такой код?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyThread = class(TThread)
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
LogMemo: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure ShowInformation(AMessage: string);
begin
Form1.LogMemo.Lines.Append(DateTimeToStr(Now) + '. ' + AMessage);
end;
procedure TMyThread.Execute;
begin
ShowInformation('thread work');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(false);
end;
end.
Бакук (2007-12-18 11:16:00) [13]Ладно. Спасибо, oldman
Бакук (2007-12-18 11:09:00) [14]> [17] oldman © (18.12.07 11:01)
>
> > Бакук © (18.12.07 10:59) [15]
> > Процедура из DLL, DLL не моя
>
>
> А если эта DLL еще чего-то требует?
> Автор процедуры умер?
Автор процедуры есть, но в лучшем случае он займется этим в след. году.
DLL ничего больше не нужно
Сергей М. (2007-12-18 11:02:00) [15]
> oldman © (18.12.07 10:53) [12]
> Но на его-то компе работает
Так карта легла)
> Бакук © (18.12.07 10:53) [13]
> 1. Я обращаюсь не внутри потока
Ничего подобного. Именно "внутри" ты и обращаешься.
> 2. Было такое же мнение, переделка на Synchronize(…) ничего
> не изменило
Этим методом надо пользоваться с умом
> 3. На одном компьютере такое работает без Exception'ов
Про Exception'ы в твоем вопросе не сказано ни слова. Да и их анализом/обработкой в твоем коде даже не пахнет.
oldman (2007-12-18 11:01:00) [16]
> Бакук © (18.12.07 10:59) [15]
> Процедура из DLL, DLL не моя
А если эта DLL еще чего-то требует?
Автор процедуры умер?
Бакук (2007-12-18 11:00:00) [17]Я бы понимал, если она вообще бы не работала. На одном работает, на втором нет. Почему непонятно.
Завтра проверю на третьем.
Бакук (2007-12-18 10:59:00) [18]Процедура из DLL, DLL не моя
oldman (2007-12-18 10:58:00) [19]
> Ну запуск процедуры я обрамил сигналками.
Это в тексте проги.
А если виснет в теле процедуры?
Программа вообще туда приходит?
Пытается выйти?
Бакук (2007-12-18 10:53:00) [20]
> [9] oldman © (18.12.07 10:49)
> Хотя бы две:
> «Я процедура, я вызвалась, начала работу»
> «Я закончила работу, результат такой-то, передаю его в программу»
Ну запуск процедуры я обрамил сигналками. Или вы другое имеете в виду?
ShowInformation('Запускл DLL');
// Func — функция из DLL. Статика
FResult := Func(…);
ShowInformation('Запуск DLL завершен');
сама функция объявлена как
function Func: integer; stdcall; external 'ACDM.dll' name 'Func';
> Обращение к визуальным VCL-контролам в доп.потоке недопустимо.
1. Я обращаюсь не внутри потока.
2. Было такое же мнение, переделка на Synchronize( ) ничего не изменило
3. На одном компьютере такое работает без Exception'ов