Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2014, 20:58   #1
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
Восклицание Процедура в потоке

Появилась проблема с подвисание программы при выполнении действия, почитал как исправить, посоветовали вывести в отдельный поток данную процедуру, стал копать в этом направлении но ничего не понял толком

Нашел такой код, но не знаю верен ли он
Код:
var
  Form1: TForm1;
  tr,id: longword;

implementation

{$R *.dfm}

procedure TForm1.writting;
begin
    //здесь твой код для записи
    CloseHandle(tr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   tr:=beginthread(nil,0,addr(TForm1.writting),nil,0,id);
end;

end.
Кто объяснит напримере процедуры, например
Код:
procedure showmsg;
begin
ShowMessage('Hello world');
end;
HTTqp вне форума Ответить с цитированием
Старый 31.03.2014, 21:46   #2
Розетко
Пользователь
 
Аватар для Розетко
 
Регистрация: 05.12.2013
Сообщений: 21
По умолчанию

Код:
unit Unit2; 

interface

...

type //MyThread - заданное нами имя потока.
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ MyThread }

procedure MyThread.Execute;
begin
  { Здесь код который будет выполняться в потоке }
end;

// Запуск потока
procedure TForm1.Button1Click(Sender: TObject);
begin
   MyThread:=TMyThread.Create(False);
   MyThread.FreeOnTerminate:=true;
   MyThread.Priority:=tpLower;
   MyThread.Resume;

end;
Почитай ссылка #1 ссылка #2
NНOGΔΛ MHΣ KΛЖΣTСЯ, 4TO MΣHЯ HΣ ПОНNМΛЮТ :[
Розетко вне форума Ответить с цитированием
Старый 01.04.2014, 11:43   #3
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

А как быть если процедура которую надо выполнить находится в DLL
HTTqp вне форума Ответить с цитированием
Старый 01.04.2014, 14:29   #4
Розетко
Пользователь
 
Аватар для Розетко
 
Регистрация: 05.12.2013
Сообщений: 21
По умолчанию

Цитата:
Сообщение от HTTqp Посмотреть сообщение
А как быть если процедура которую надо выполнить находится в DLL
Тогда нужно динамически или статистически грузить ее от туда, почитать об этом вы можете здесь, здесь или здесь
NНOGΔΛ MHΣ KΛЖΣTСЯ, 4TO MΣHЯ HΣ ПОНNМΛЮТ :[
Розетко вне форума Ответить с цитированием
Старый 02.04.2014, 16:40   #5
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Не, с DLL я знаком, умею загружать, выгружать. Вопрос был как выполнить в потоке процедуру которая находится в DLL?
Выше пример как в самой программе запустить поток, без использования DLL.
Получается так:
Код:
unit Unit2; 

interface

...

type //MyThread - заданное нами имя потока.
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ MyThread }

procedure MyThread.Execute;
begin
  { процедура из DLL } // глупа создавать процедуру procedure MyThread.Execute, для того чтобы поместить туда другую процедуру которая описана в DLL
end;

// Запуск потока
procedure TForm1.Button1Click(Sender: TObject);
begin
   MyThread:=TMyThread.Create(False);
   MyThread.FreeOnTerminate:=true;
   MyThread.Priority:=tpLower;
   MyThread.Resume;

end;
и что все же лучше динамическое или статистическая загрузка?
HTTqp вне форума Ответить с цитированием
Старый 02.04.2014, 20:21   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Статический импорт является более удобным, а динамический — более гибким. Что лучше, решать вам.

Статическое подключение DLL
При старте вашей программы подключенная таким образом функция уже загружена и находится в адресном пространстве программы.
Загрузку этих функций выполняет загрузчик исполняемых файлов и производится это при старте программы. Очевидно что такой способ является самым простым, но не оптимальным:
1) Если необходимых программе функций и библиотек много, то процесс их загрузки может занять значительное время
2) Функции будут отнимать оперативную память, причем все и одновременно, хотя программе возможно они не нужны в один и тот же момент времени
3) Если какая-нибудь из необходимых библиотек отсутствует, то загрузка программы станет невозможна, т.е. таким образом невозможно реализовать, например, механизм плагинов.

Динамическое подключение DLL
Недостатков статической лишена динамическая. Происходит только тогда, когда она нужна. Выгрузить библиотеку из памяти также можно в любой момент времени. Загрузка библиотеки происходит по вызову функции LoadLibrary, которая принимает в качестве параметра имя библиотеки. После загрузки библиотеки, адреса каждой нужной функции можно получить с помощью функции GetProcAddress, которой нужно сообщить выданный первой функцией обработчик и имя функции.
Alter вне форума Ответить с цитированием
Старый 02.04.2014, 20:46   #7
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
Вопрос

Цитата:
Сообщение от HTTqp Посмотреть сообщение
глупа создавать процедуру procedure MyThread.Execute, для того чтобы поместить туда другую процедуру которая описана в DLL
А что в DLL разве нельзя создать поток?!
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Старый 02.04.2014, 21:47   #8
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от yaschenko Посмотреть сообщение
А что в DLL разве нельзя создать поток?!
Так можно?
HTTqp вне форума Ответить с цитированием
Старый 03.04.2014, 09:03   #9
yaschenko
Пользователь
 
Аватар для yaschenko
 
Регистрация: 29.03.2014
Сообщений: 26
По умолчанию

Цитата:
Сообщение от HTTqp Посмотреть сообщение
Так можно?
Я попробовал создать поток в dll на мой взгляд работает, попробуйте сами.
Отладка - это процесс осознания того, что программа делает только то, что ты написал, а не то, что ты хотел написать.
yaschenko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из метода X в потоке А, вызвать метод Y и чтобы он работал в потоке B ? lawliet93 C# (си шарп) 0 09.03.2013 18:16
Пауза в потоке _ZixeL_ Общие вопросы Delphi 9 27.01.2013 16:02
Создание/изменение/удаление файлов в потоке. Мониторинг файлов в потоке. The Real Kos Общие вопросы Delphi 5 22.10.2012 23:58
Процедура в процедура в C++ Builder Ecosasha C++ Builder 2 06.06.2009 17:17
TClientSocket в потоке BlackOmen Работа с сетью в Delphi 8 27.04.2008 22:19