Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не работает CreateThread 
V
    Опции темы
SandyProgrammer
  Дата 3.7.2008, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Здравтсвуйте.
В Delphi World нашёл вот это:
Вызов процедуры в другом потоке: CreateThread(nil,0,@MyProcedure,0,0,nil); 
Попробовал, а не работает... Пишет ошибку: Types of actual and formal var parameters must be identical.
Тут что-то с фактическими параметрами не так, а что? Подскажите пожалуйста.
PM MAIL   Вверх
v1rtu0z
Дата 3.7.2008, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 21.4.2008
Где: Воронеж

Репутация: нет
Всего: нет



напиши как ты попробовал...
может указатель типизированный передаешь?..
PM MAIL ICQ   Вверх
SandyProgrammer
Дата 3.7.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Вот так пробовал:
Код

procedure MyProcedure;
begin
//code here
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CreateThread(nil,0,@MyProcedure,0,0,nil);
end;

Я просто впервые с CreateThread познакомился.
PM MAIL   Вверх
Snowy
Дата 3.7.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Код
var
  id: DWORD;
begin
  CreateThread(nil, 0, @MyProcedure, nil, 0, id);
end;

PM MAIL   Вверх
ama_kid
Дата 3.7.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



SandyProgrammer, последний параметр объявлен как var, поэтому нельзя туда ни nil, ни 0 ста
Код
procedure TForm1.Button1Click(Sender: TObject);
var
 dw:Dword;
begin
 CreateThread(nil,0,@MyProcedure,nil,0,dw);
end;
вить:


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
SandyProgrammer
Дата 3.7.2008, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Snowyama_kid, спасибо большое, теперь всё понятно.
PM MAIL   Вверх
Alexeis
Дата 3.7.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Чуток не по теме, но помниться борланд рекомендует использовать BeginThread вместо CreateThread. Там что-то связано с очисткой стека потока или еще с чем. В общем по соображениям безопасности smile .

Добавлено через 1 минуту и 54 секунды
Ага, вот цитата
Цитата(ms-help://borland.bds5/delphivclwin32/System_BeginThread.html)

 BeginThread spawns a new thread of execution and sets the global IsMultiThread variable, thereby making the heap thread-safe



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
SandyProgrammer
Дата 3.7.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Цитата(Alexeis @ 3.7.2008,  13:45)
Чуток не по теме, но помниться борланд рекомендует использовать BeginThread вместо CreateThread. Там что-то связано с очисткой стека потока или еще с чем. В общем по соображениям безопасности smile .

Да, читал про это, ещё хотел спросить, чем отличается CreateThread от BeginThread.
PM MAIL   Вверх
Alexeis
Дата 3.7.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(SandyProgrammer @  3.7.2008,  12:47 Найти цитируемый пост)
Да, читал про это, ещё хотел спросить, чем отличается CreateThread от BeginThread.

  Ну там еще запускается дополнительный код для включения механизма исключений в дополнительном потоке.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 3.7.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



ага, а так же в BeginThread нужно передавать локальную "паскалевякую" функцию, а в CreateThread - stdcall.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Rrader
  Дата 3.7.2008, 14:23 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(ama_kid @  3.7.2008,  20:36 Найти цитируемый пост)
поэтому нельзя туда ни nil, ни 0 ста

Когда ThreadID не нужен, то почему бы и нет smile 
Код

CreateThread(NIL, 0, @MyProcedure, NIL, 0, PLongWord(NIL)^);


Добавлено через 3 минуты и 29 секунд
Но в Win9x не прокатит...


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
ama_kid
Дата 3.7.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(Rrader @  3.7.2008,  14:23 Найти цитируемый пост)
Когда ThreadID не нужен, то почему бы и нет smile 
Как говорится, "если нельзя, но очень хочется - то можно" smile Интересный финт ушами...  smile 



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
bems
Дата 3.7.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Alexeis @  3.7.2008,  14:08 Найти цитируемый пост)
Ну там еще запускается дополнительный код для включения механизма исключений в дополнительном потоке.
и менеджер памяти начинает работать в критических секциях



--------------------
Обижено школьников: 8
PM MAIL   Вверх
uranpro
Дата 4.7.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



интересно..

Код

try
 BeginThread(NIL, 0, @MyProcedure, NIL, 0, PLongWord(NIL)^);
except
 end;

как вы думаете, будет работать исправно ?

Добавлено через 4 минуты и 51 секунду
попробовал... жжесть, 2 ошибки выдает, одна из них про память)) не работает=(


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Alexeis
Дата 4.7.2008, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(uranpro @  4.7.2008,  10:17 Найти цитируемый пост)
как вы думаете, будет работать исправно ?

  Будет. Это ж передача по ссылке. Один пытается разыменовать указатель, а другой взять адрес. Компилятор обычно взаимоуничтожает такие операции smile

Добавлено через 1 минуту и 16 секунд
  Просто обманка для компилятора smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ama_kid
Дата 4.7.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Цитата(uranpro @  4.7.2008,  11:17 Найти цитируемый пост)
попробовал
пробуй до тех пор пока не заработает  smile 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
uranpro
Дата 4.7.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



)) куль! еще вопросик

Код

procedure MyProc(var res:boolean);
var i:Integer;
begin
try
for i:=1 to 100 do begin
 if i=20 then Form1.Memo1.Lines.Add('20a');
 Sleep(30);
 if i=40 then Form1.Memo1.Lines.Add('40a');
 if i=80 then StrToInt(Form1.Memo1.Text); //делаем ошибку ^^,
 end;
 res:=true;
except
 res:=false;
 end;
end;

var res:boolean;
BeginThread(nil,0,@MyProc(res) ,nil,0,PLongWord(nil)^);

почему он ругается? когда не задаю параметр вобще- работает, когда удаляю из самой процедуры параметр - работает.

msg: varible required

Добавлено через 3 минуты и 5 секунд
и еще когда из процедуры пытаюсь показать сообщение(showmessage) - он выдает какую-то странную форму, она случайного размера, ширина и высота может быть >10000     o_0

Добавлено через 5 минут и 24 секунды
ama_kid, я знаю как проверить. просто на except у меня было showmessage а оно не неральной формы, я сначала и не понял, что это showmessage))


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
ama_kid
Дата 4.7.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 9
Всего: 95



Во-первых, потоковая функция имеет тип:
Код
type TThreadFunc = function(Parameter: Pointer): Integer;
Поэтому делай такой же.
Во вторых (и это главное) - так делать нельзя:
Код
...,@MyProc(res)...
Третий параметр - это просто указатель на функцию, а параметр самой функции передается четвертым параметром BeginThread. В общем, читаем тут


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
uranpro
Дата 4.7.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



и еще один))
почему я не могу запустить свою процедуру, которая является методом класса ?

Код

TFormReportPRO = class(TForm)
     ///
   {TEXT}
   ///
private
    { Private declarations }
     ///
   procedure Gen;
   ///
  public
    { Public declarations }
  end;

procedure FormReportPRO.butclick
begin
BeginThread(nil,0,@Gen ,nil,0,PLongWord(nil)^);                           //не работает
BeginThread(nil,0,@FormReportPRO.Gen ,nil,0,PLongWord(nil)^); //не работает
end;



--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Rennigth
Дата 4.7.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



потому что это 
Цитата

метод класса

 smile 
он имеет первым параметром ссылку на объект, плюс передача парамеров происходит с соглашением register.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
bems
Дата 5.7.2008, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(uranpro @  4.7.2008,  12:58 Найти цитируемый пост)
почему я не могу запустить свою процедуру, которая является методом класса ?

ну тебе ж ужу сказали:
Цитата(ama_kid @  3.7.2008,  14:39 Найти цитируемый пост)
"если нельзя, но очень хочется - то можно" 
 вот так:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    s:string;
    procedure ThreadMethod;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var mtd:procedure of object;
begin
s:='WOW!';
mtd:=ThreadMethod;
BeginThread(nil,0,TMethod(mtd).Code,TMethod(mtd).Data,0,PLongWord(nil)^);
end;

procedure TForm1.ThreadMethod;
begin
AllocConsole;
Writeln(s);
end;

end.




--------------------
Обижено школьников: 8
PM MAIL   Вверх
uranpro
Дата 5.7.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 571
Регистрация: 7.5.2008
Где: Moscow city

Репутация: нет
Всего: 1



bems, интересно! большое спасибо.
а я решил так
Код

procedure tform1.mproc;
begin
///
end;

procedure linkmprok
begin
mproc;
end;

procedure tform1.buttonclick
begin
linkmproc;
end;


))) правлю на твой код!


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1244 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.