Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL и поток


Страницы:   1 2

Бакук ©   (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'ов


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо