Форум: "Начинающим";
Текущий архив: 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(…);
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(…)
> исключение
Разве при статическом методе программа не вывалится с ошибкой при запуске?
Вставилtry
ShowInformation("Запускл DLL");
// Func — функция из DLL. Статика
FResult := Func(…);
То же самое. Сообщение Запуск DLL и замер
> Делаем однозначный вывод:
> Если программа одна, DLL одна, значит либо ошибка в настройках,
> либо в 17-й строке…
Так я и интересуюсь, какие такие настройки могут повлиять на запуск программы?
← →
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(…) ничего не изменило
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 года подобным образом.
Ох, аж мурашки по коже… Сколько кода с потенциально опасным кодом… Страшно…
← →
Бакук © (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 не событие потока…?
← →
Сергей М. © (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