Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > CreateThread и функция класса


Автор: ButtonOFF 2.5.2014, 17:50
Объясните пожалуйста.

Есть форма - главное окно. Необходимо создать поток через CreateThread  и передать в качестве функции - функцию класса
Код

  TfmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    class procedure WorkProc(lpParameter: Pointer); stdcall;
  public
    { Public declarations }
  end;

class procedure TfmMain.WorkProc(lpParameter: Pointer); stdcall;
begin
  // работа потока
end;

procedure TfmMain.FormCreate(Sender: TObject);
begin
    CreateThread(nil, 0, @WorkProc, Self, 0, thrID);
end;


Что я делаю не так? и как сделать так как хочется?

Автор: kami 2.5.2014, 21:28
Как минимум - ThreadProc - это функция с результатом типа DWORD

Добавлено через 2 минуты и 10 секунд
Ну и, раз не используется BeginThread - надо бы самостоятельно выставить IsMultiThread:=True;

Автор: ButtonOFF 2.5.2014, 21:35
Цитата

Ну и, раз не используется BeginThread - надо бы самостоятельно выставить IsMultiThread:=True; 


Можно поподробнее

Автор: kami 2.5.2014, 21:39
Понял, в чем был вопрос smile
Код

CreateThread([email protected]...

Но это не отменяет предыдущего сказанного.

Добавлено через 4 минуты и 45 секунд
Цитата(ButtonOFF @  2.5.2014,  21:35 Найти цитируемый пост)
Можно поподробнее

Попытаюсь. Емнип, IsMultiThread влияет на работу менеджера памяти, переключая его в какой-то специальный режим.
BeginThread, помимо прочих действий, делает IsMultiThread = True. Если так уж надо использовать CreateThread, то надо самому выставить эту системную переменную.

Автор: ButtonOFF 2.5.2014, 21:47
Хорошо задам по-другому немного вопрос. Можно ли запустить поток на выполнение функции из класса, как в моем примере, только что бы этот поток мог обращаться ко ВСЕМ объектам класса ?

Код

Но это не отменяет предыдущего сказанного.


Я так и не понял о чем речь... 
Цитата

Можно поподробнее 

Автор: kami 2.5.2014, 21:54
Цитата(ButtonOFF @  2.5.2014,  21:47 Найти цитируемый пост)
мог обращаться ко ВСЕМ объектам класса

Теперь я не понимаю, о чем речь:) Как это - ко всем объектам класса? Ко всем экземплярам этого класса? Или к полям одного экземпляра?

Повторюсь:
  1. WorkProc из процедуры сделать функцией, которая возвращает DWORD.
  2. В FormCreate до вызова CreateThread написать IsMultiThread:=True;

Автор: ButtonOFF 3.5.2014, 09:50
kami,  Ну вот в первом посте пример, если сделать так, но с поправкой 
Код

CreateThread([email protected]...
 то я из потока не могу обращаться к переменным, а хотелось бы чтобы из потока мог использовать все переменные этого класса и по возможности его методы

Автор: Poseidon 3.5.2014, 11:23
Цитата(ButtonOFF @  2.5.2014,  21:47 Найти цитируемый пост)
Можно ли запустить поток на выполнение функции из класса, как в моем примере, только что бы этот поток мог обращаться ко ВСЕМ объектам класса ?
 Вообще очень интересно поставлена задача: из отдельного потока нужно иметь возможность обращаться ко всем полям и методам класса формы! Тут на лицо несоблюдение основного принципа многопоточности - к VCL обращаться только из основного потока. Почему такое категоричное желание использовать CreateThread? Раз используется TForm, то очевидно что это не приложение на WinAPI. Тогда почему бы не воспользоваться TThread и избежать многочасовых поисков глюков?

Автор: ButtonOFF 3.5.2014, 18:46
Сейчас именно этим и занимаюсь, основной бедой было вывести в главную форму результат выполнения потока, вот подумал может есть делегат какой-нибуть, типа как на шарпе

Автор: stanilar 5.5.2014, 09:32
Цитата(ButtonOFF @ 3.5.2014,  16:46)
Сейчас именно этим и занимаюсь, основной бедой было вывести в главную форму результат выполнения потока, вот подумал может есть делегат какой-нибуть, типа как на шарпе


У процедуры из WorkProc есть параметры, соответственно ничто не мешает передать весь объект или класс. 


Автор: bems 7.5.2014, 03:51
также у классовых методов тоже есть self, поэтому тебе нужен class static

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)