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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.056 c
6-1178537137
user51
2007-05-07 15:25
2008.01.20
как узнать имя рабочей группы компьютера ?


2-1197947467
mrFreeman2007
2007-12-18 06:11
2008.01.20
Воспроизведение видео в отдельном окне


1-1192631833
Циркуль
2007-10-17 18:37
2008.01.20
Как должна работать удаленная отладка ?


2-1197979576
istok
2007-12-18 15:06
2008.01.20
верна ли функция


15-1197467874
I
2007-12-12 16:57
2008.01.20
Inno Setup





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