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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Threads, Threads - как создать потоки? 
:(
    Опции темы
Barovskiy
Дата 15.1.2006, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!!!!!!!!!!!!
У меня такой вопрос - как можно загнать в отдельный поток определенное действие??
например:
мне нужно загнать цикл

try
begin
Yield;
application.ProcessMessages;
...........

except
.............

finally
...............

end;


в потоки
как это сделать и как определить количество потоков????
программа просто очень виснет и очень медлено выполняет действия (((((((((((
а с потоками я не рабтал

кто может мне объяснить популярно как загнать все это в поток?????

Заранее благодарю!!!!!!!!!


PM MAIL   Вверх
Poseidon
Дата 15.1.2006, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Вот самый простой пример. Причем без использования класса TTread.

Код
procedure MyProcedyre; // долгая процедура
begin
try
Yield;
application.ProcessMessages;
...........

except
.............

finally
...............
end;
end;

procedure TForm1.Button1Click(Sender: TObject);  // запускаем поток
var  
h:cardinal;  
begin  
CreateThread(nil,128,@MyProcedyre,self,0,h); 
end; 


Это сообщение отредактировал(а) Poseidon - 15.1.2006, 03:46


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Barovskiy
Дата 15.1.2006, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Poseidon ,
спасибо, за ответ!!!!!!!!

а как определить кол-во потоков???? к пример усделать 100 потоков чтоб за один раз 100 циклов прошло?????
PM MAIL   Вверх
Poseidon
Дата 15.1.2006, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Экстремал smile Тут смотря что у тебя в потоках, нужна ли синхролизация... В общем виде можно и так так:
Код
procedure TForm1.Button1Click(Sender: TObject);  // запускаем поток
var  
h:cardinal;  
i: integer;
begin  
for i:= 1 to 100 do CreateThread(nil,128,@MyProcedyre,self,0,h); 
end; 


но вариант не идеален. И более того, я бы для твоей задачи все же воспользовался бы TThread. Там хоть синхролизировать можно потоки. Хотя и этот вариант может прокатить


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 15.1.2006, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



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


Шустрый
*


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

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



2 Poseydon smile Хех... я что-то и не подумал так его пустить )))))) Спасибо, сегодня буду тестить!!!!!

2 FRAGNATIC
http://forum.vingrad.ru/index.php?showtopic=60076

Отличный материал!!!!! Спасибо!!!!!!!!!!
PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(Barovskiy)

application.ProcessMessages;

при выполнении в отдельном потоке на этой строчке могут возникать ошибки....


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 15.1.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



2 Albinos_x

А как лучше сделать чтоб прога не тормазила????
PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(Barovskiy @ 15.1.2006, 14:02 Найти цитируемый пост)

2 Albinos_x

А как лучше сделать чтоб прога не тормазила????

так если ты запустишь это в отдельном потоке, то она и так тормозить не будет ... поэтому эта строчка автомарически должна отпасть...


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 15.1.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



у меня не компилируется ((((((

Код

procedure MyProcedyre; // долгая процедура
begin
try
Yield;
...........

except
.............

finally
...............
end;
end;


внутри цикла я обращаюсь к компонентам например
Код

finally
label2.caption:= 'Complite';
end;



как мне можно работать с компонентами внутри процедуры???
в цикле идет счет выполненых операций....

Код


 Label6.Caption:=floattostr(strtofloat(Label6.Caption)+1);



вобщем ругается на все компоненты (((((((( как это лечить ??????


PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



ты должен указать "чей компанент":
Код
...
Form1.label2.caption:= 'Complite';
...

но здесь тоже могут возникать глюки... здесь лучше делать:
Цитата(Poseidon @ 15.1.2006, 04:10 Найти цитируемый пост)

я бы для твоей задачи все же воспользовался бы TThread. Там хоть синхролизировать можно потоки. Хотя и этот вариант может прокатить



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 15.1.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Albinos_x @ 15.1.2006, 16:53 Найти цитируемый пост)

ты должен указать "чей компанент":


я сделал так
Код

procedure MyProcedure;
var
 RxLabel6: TRxLabel;
....
begin
... 


скопилилось почти нормально за исключением

[Warning] Unit1.pas(126): Variable 'Label6' might not have been initialized

прога запускается нормально, но как только нажимаю на кнопку для пуска потока - Вылетает ошибка

что какой то кусок памяти не может быть рид ....

как мне инициализировать - указать чей компонент ????

PM MAIL   Вверх
Albinos_x
Дата 15.1.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



А как ты создаёшь этот:
var
RxLabel6: TRxLabel;
?


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Barovskiy
Дата 15.1.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Albinos_x @ 15.1.2006, 18:20 Найти цитируемый пост)

А как ты создаёшь этот:
var
RxLabel6: TRxLabel;
?


RxLabel6: TRxLabel; - RX компонент, проще говоря так

Код


procedure MyProcedure;
var 
Label6: TLabel;
...

begin 
...



а как надо указать чей компонент???????




PM MAIL   Вверх
FRAGNATIC
Дата 15.1.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Цитата(Barovskiy @ 15.1.2006, 19:00 Найти цитируемый пост)

RxLabel6: TRxLabel; - RX компонент, проще говоря так


код Pascal/Delphi

procedure MyProcedure;
var 
Label6: TLabel;
...
begin 
...



а как надо указать чей компонент???????

nil
те надо
var
Label6: TLabel;
...
begin
label6:=TLabel.Create(nil);

Это сообщение отредактировал(а) FRAGNATIC - 15.1.2006, 19:16
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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