Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.20;
Скачать: CL | DM;

Вниз

DLL и поток   Найти похожие ветки 

 
Бакук ©   (2007-12-18 10:24) [0]

Поток и ДЛЛ

TT = class(TThread)
 protected
AMessage: PChar;
   procedure Execute; override;
end;

procedure TT.Execute;
var
 FResult: integer;
begin
 ShowInformation("Старт");
 ShowInformation("Запускл DLL");

 // Func — функция из DLL. Статика
 FResult := Func(&#133);

 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 произвести не могу

Какие могут быть причины?


 
oldman ©   (2007-12-18 10:26) [1]


> Компьютер удаленный


А DLL на нем есть, или он с твоего по сетке тянет?


 
Бакук ©   (2007-12-18 10:28) [2]

Нет, DLL лежит в папке с программой


 
Skyle ©   (2007-12-18 10:36) [3]

Всё же добавь код, проверяющий правильность определения Func. И её исполнения. Вдруг где-то в строке
FResult := Func(...)
исключение


 
oldman ©   (2007-12-18 10:37) [4]

Делаем однозначный вывод:
Если программа одна, DLL одна, значит либо ошибка в настройках, либо в 17-й строке...


 
Бакук ©   (2007-12-18 10:42) [5]

> [3] Skyle ©   (18.12.07 10:36)
> Всё же добавь код, проверяющий правильность определения
> Func. И её исполнения. Вдруг где-то в строке
> FResult := Func(&#133)
> исключение

Разве при статическом методе программа не вывалится с ошибкой при запуске?
Вставил
try
ShowInformation("Запускл DLL");

// Func — функция из DLL. Статика
FResult := Func(…);


То же самое. Сообщение Запуск DLL и замер


> Делаем однозначный вывод:
> Если программа одна, DLL одна, значит либо ошибка в настройках,
> либо в 17-й строке&#133

Так я и интересуюсь, какие такие настройки могут повлиять на запуск программы?


 
oldman ©   (2007-12-18 10:44) [6]


> Так я и интересуюсь, какие такие настройки могут повлиять
> на запуск программы?


Не на запуск программы, а на вызов функции из DLL.
Например, путь к этой DLL :)))


 
Бакук ©   (2007-12-18 10:45) [7]

> [6] oldman ©   (18.12.07 10:44)
>
> > Так я и интересуюсь, какие такие настройки могут повлиять
>
> > на запуск программы?
>
>
> Не на запуск программы, а на вызов функции из DLL.
> Например, путь к этой DLL :)))


DLL найдена, процедура найдена. Не здесь ошибка.


 
oldman ©   (2007-12-18 10:48) [8]


> DLL найдена, процедура найдена. Не здесь ошибка.


Для проверки вставь еще сигнальные мессы в тело процедуры.
Виснет-то либо прога во время вызова/получения результата,
либо сама процедура.


 
oldman ©   (2007-12-18 10:49) [9]

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


 
Сергей М. ©   (2007-12-18 10:49) [10]


> Бакук ©   (18.12.07 10:45) [7]


Обращение к визуальным VCL-контролам в доп.потоке недопустимо.


 
Сергей М. ©   (2007-12-18 10:51) [11]


> Бакук ©   (18.12.07 10:45) [7]


Так что dll тут пока ни причем, хотя не исключено, что и в ее коде ты допустил ошибки.


 
oldman ©   (2007-12-18 10:53) [12]


> Сергей М. ©   (18.12.07 10:51) [11]


Но на его-то компе работает :)))


 
Бакук ©   (2007-12-18 10:53) [13]


> [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(&#133) ничего не изменило
3. На одном компьютере такое работает без Exception"ов


 
oldman ©   (2007-12-18 10:58) [14]


> Ну запуск процедуры я обрамил сигналками.


Это в тексте проги.
А если виснет в теле процедуры?
Программа вообще туда приходит?
Пытается выйти?


 
Бакук ©   (2007-12-18 10:59) [15]

Процедура из DLL, DLL не моя


 
Бакук ©   (2007-12-18 11:00) [16]

Я бы понимал, если она вообще бы не работала. На одном работает, на втором нет. Почему — непонятно.
Завтра проверю на третьем.


 
oldman ©   (2007-12-18 11:01) [17]


> Бакук ©   (18.12.07 10:59) [15]
> Процедура из DLL, DLL не моя


А если эта DLL еще чего-то требует?
Автор процедуры умер?


 
Сергей М. ©   (2007-12-18 11:02) [18]


> oldman ©   (18.12.07 10:53) [12]
> Но на его-то компе работает


Так карта легла)


> Бакук ©   (18.12.07 10:53) [13]



> 1. Я обращаюсь не внутри потока


Ничего подобного. Именно "внутри" ты и обращаешься.


> 2. Было такое же мнение, переделка на Synchronize(…) ничего
> не изменило


Этим методом надо пользоваться с умом


> 3. На одном компьютере такое работает без Exception"ов


Про Exception"ы в твоем вопросе не сказано ни слова. Да и их анализом/обработкой в твоем коде даже не пахнет.


 
Бакук ©   (2007-12-18 11:09) [19]

> [17] oldman ©   (18.12.07 11:01)
>
> > Бакук ©   (18.12.07 10:59) [15]
> > Процедура из DLL, DLL не моя
>
>
> А если эта DLL еще чего-то требует?
> Автор процедуры умер?


Автор процедуры есть, но в лучшем случае он займется этим в след. году.
DLL ничего больше не нужно


 
Бакук ©   (2007-12-18 11:16) [20]

Ладно. Спасибо, oldman


 
Бакук ©   (2007-12-18 15:46) [21]

Уважаемый Сергей М. Почему тогда работает такой код?

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 15:54) [22]


> Бакук ©   (18.12.07 15:46) [21]


Ну нельзя так делать, понимаешь или нет ?

Так карта легла - сегодня работает, а завтра теми же граблями по тому же лбу)


 
Бакук ©   (2007-12-18 16:08) [23]

Ну я конечно знаю про рекомендации не работать с VCL-Visual, однако пишу уже 3 года подобным образом. И "граблями по лбу" не выхватывал, поэтому решил спросить у вас )


 
Kolan ©   (2007-12-18 16:11) [24]

> Ну я конечно знаю про рекомендации не работать с VCL-Visual,
> однако пишу уже 3 года подобным образом.

Ох, аж мурашки по коже&#133  Сколько кода с потенциально опасным кодом&#133 Страшно&#133


 
Бакук ©   (2007-12-18 16:17) [25]


> Ох, аж мурашки по коже…  Сколько кода с потенциально опасным
> кодом… Страшно…


Да, я ламер ))))


 
Сергей М. ©   (2007-12-18 16:18) [26]


> Бакук ©   (18.12.07 16:08) [23]


> я конечно знаю про рекомендации


Какого же лешего ты их не выполняешь ?


> "граблями по лбу" не выхватывал


У тебя все еще впереди)


 
Бакук ©   (2007-12-18 16:20) [27]


> Какого же лешего ты их не выполняешь ?

Я ответил постом выше )))))


 
Anatoly Podgoretsky ©   (2007-12-18 16:22) [28]

> Сергей М.  (18.12.2007 16:18:26)  [26]

Уже в прошлом.


 
Kolan ©   (2007-12-18 16:24) [29]

> Я ответил постом выше )))))


А самое обидное что разница в несколько строк:

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 не событие потока&#133?


 
Сергей М. ©   (2007-12-18 16:28) [30]


> Бакук ©   (18.12.07 16:20) [27]


Ну продолжай в том же духе.


 
Leonid Troyanovsky ©   (2007-12-18 19:15) [31]


> Kolan ©   (18.12.07 16:24) [29]

> А самое обидное что разница в несколько строк:

Для библиотеки разница может быть и более.
Бо, даже применимость Synchronize д.б. тщательно обоснована.

IMHO, перед нами очередной клиент BadTips.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-12-18 19:18) [32]


> Anatoly Podgoretsky ©   (18.12.07 16:22) [28]

> Уже в прошлом.

Forever :)

--
Regards, LVT.



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

Текущий архив: 2008.01.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
1-1192534195
Se1lor
2007-10-16 15:29
2008.01.20
Image и регионы


15-1197349485
AntiPupkin
2007-12-11 08:04
2008.01.20
Скажите правду?


2-1198268866
Elec3C
2007-12-21 23:27
2008.01.20
Обработка клавиш


2-1198222673
Kolan
2007-12-21 10:37
2008.01.20
Возвращение объекта из процедуры.


15-1197729611
Jade
2007-12-15 17:40
2008.01.20
IP-адреса