Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизНаучите работать с потоками нормально или ссылку дайте? Найти похожие ветки
← →
MadGhost (2004-01-24 23:12) [0]Люди, честно не от большой глупости пишу :( ну тупо понимаю я как с ними работать, ну создал я его File->New THread вписал процедурку в Execute и все? вызвал из программы с параметром false она у меня сразу выполнилась и фсе?
или как? или может дайте ссылку, действительно хорошую. Мне понравилась ссылка типа той которую дал Anatoly Podgoretsky про двоичную матемитику, так подробно расписано там было, просто супер.
помогите плизз
← →
Ihor Osov'yak (2004-01-24 23:41) [1]У Рихтера довольно хорошо написано. См. Джеффри Рихтер, "Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows", изд. "Питер", 2000., можно и пред. издания.
Злые языки говорят, что местами в инет в электронном виде бегает, попытай щастья на поисковиках.
Но эта книга входит в перечень тех, которых желательно иметь в бумажном виде.
Зы. А сотв. делфийский класс - только надстройка над сотв. виндознымы обьектами.
← →
BorH (2004-01-24 23:41) [2]Вот ещё раз даю:
С:\Program Files\Borland\Delphi7\Help\Examples\Prgrsbar\
Это типа, пример с прогрессбаром.
Не советую путать процесс (Thread) с потоками (TStream). Процесс - это процесс (сорри за каламбур), протекающий независимо от основной программы, занимающий (как бы так сказать) отдельное процессорное время. Но при всём этом, он имеет одну область памяти с твоим приложением. В общем, теория у меня никада не получалась...
Короче, в вышеуказаном примере всё просто:
В основном теле программы ты создаёшь процесс
YourThread:=TYourThread.Create;
В самом тхреаде в процедуре Execute пишешь какой - нибудь долгий цикл. Ну или просто какую - нибудь операцию.
Остальное поищи в www.google.com/ru
← →
Stilgar (2004-01-24 23:57) [3]2 BorH © (24.01.04 23:41) [2]
В приложении не может быть двух процессов. Чтобы вы вспомноли, предлагаю припомнить чем многозадачность отличается от многопоточности. Кстати Thread переводится как "нить", и его также называют потоком (TStream здесь не причем).
Кстати на http://podgoretsky.com есть Тейкстейра и Пачеко, во втором томе есть про потоки (советую скачать и первый заодно). Вот прямые ссылки:
http:/podgoretsky.pri.ee/cgi-bin/dlcounter/npscnt?file= http://podgoretsky.com/ftp/Docs/Delphi/D5/Delphi5vol1.pdf&file_id =Delphi5vol1
http:/podgoretsky.pri.ee/cgi-bin/dlcounter/npscnt?file= http://podgoretsky.com/ftp/Docs/Delphi/D5/Delphi5vol2.pdf&file_id =Delphi5vol2
← →
MadGhost (2004-01-24 23:59) [4]Ihor Osov"yak >>>
есть у меня эта книга, тока она для Visual C++, это не много другое вродеб, или нету разграничений?
BorH >>>
это понятно, спасибо, но не подробно это чтоли, с теорией у меня тоже трудности. сказать как.
есть даже книжка Марко Кэнту "Делфи 5, для профессионалов", тогу доходит до меня просто, буду читать.
← →
Ihor Osov'yak (2004-01-25 00:13) [5]2 [4] MadGhost © (24.01.04 23:59)
Там примеры с использованием классического си, и с использованием апишных вызовов только, без всяких навотов типа mfc от vs. Классический си + чистый апи практически один в один переводится в процедурный паскаль.
Да и ценность этой книги не так в примерах, а в той общей философии тем, что там есть.. А философия она одинаковая, что делфи, что си..
Зы. А относительно си - пора уже бы привыкнуть к тому, что большинство примеров в литературе на си приводится. Это я к тому, что желательно си хотя бы в режиме рид-онли это.. Как его. Юзать. О.
← →
MadGhost (2004-01-25 00:18) [6]Ihor Osov"yak >>>
я знаю Си, и не только в read only, больших приложений я на нем не писал, да и Делфи больших не писал :) а так на Линукс в Сях пишу тулзы, или на Перле (но давно не писал на нем).
Ладно, спасибо большое, я думал там все по другому, и классы по другому описаны, типы данных. Еси так, то буду читать все внимательней ;) большое при большое спасибо
← →
TUser (2004-01-25 08:03) [7]Насчет Рихтера в интернете - весит файл 55М. Проще на диске купить за 70р. Диск называется "Си и Сиплюсплюс: справлсник студента" Лично я в МГУ его прикупил недавно, если очень надо могу объяснить где конкретно.
← →
Юрий Зотов (2004-01-25 08:22) [8]> BorH © (24.01.04 23:41) [2]
> Не советую путать процесс (Thread) с потоками (TStream).
Еще более не советую путать процесс (Process) с потоками (Thread, Stream). Тем более, не стоит путать других.
← →
MadGhost (2004-01-25 13:25) [9]>>>>>>Юрий Зотов © (25.01.04 08:22) [8]
> BorH © (24.01.04 23:41) [2]
> Не советую путать процесс (Thread) с потоками (TStream).
Еще более не советую путать процесс (Process) с потоками (Thread, Stream). Тем более, не стоит путать других.
точна зупутал :)
у меня другая грабля с потоками да и вообще классами наверное, это все этого касается.
unit MyComp2;
interface
uses
Windows, Messages, SysUtils, Classes;
type
TOnMyEvent=procedure(Sender:TObject) of Object;
type
TMyThread=class(TThread)
private
protected
procedure Execute;override;
public
published
end;
type
TMyComp2 = class(TComponent)
private
{ Private declarations }
FOnMyEvent:TOnMyEvent;
FCount:integer;
FPosition:integer;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
property OnMyEvent:TOnMyEvent read FOnMyEvent write
FOnMyEvent;
property Count:integer read FCount write FCount;
property Position:integer read FPosition write FPosition;
procedure Cycle;
function Pos:integer;
procedure Create;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents("Standard", [TMyComp2]);
end;
{ TMyComp2 }
procedure TMyComp2.Create;
begin
FCount:=1000000;
end;
procedure TMyComp2.Cycle;
var
Thread1:TMyThread;
begin
Thread1:=TMyThread.Create(false);
Thread1.Execute;
end;
function TMyComp2.Pos: integer;
begin
Result:=FPosition;
end;
{ TMyThread }
procedure TMyThread.Execute;
var
i:integer;
begin
inherited;
for i:=0 to FCount do
begin
FPosition:=i;
if Assigned(FOnMyEvent) then FOnMyEvent(Self);
end;
end;
end.
т.е. вот создал я в так называемом компоненте событие, значит, решил засунуть его в отдельный поток, создал TMyThread, и значит см. код выше, попытался в функции Cycle запустить этот поток. Но как из этого потока получить доступ к переменным компонента?
с этим у меня большие грабли помогите мастера плиЗЗЗЗЗ.....
самостоятельно не поборю
← →
Palladin (2004-01-25 18:43) [10]Thread1.Execute - лишняя строка... он и без тебя Execute сделает... inherited в теле TMyThread.Execute тоже лишнее ибо он abstract в TThread...
получить доступ к полям компонента можно
1 создав свой конструктор у TThread (в котором естественно вызвать родной) который принимает в параметре ссылку на объект класса компонента
2 создать поле/свойство у TMyThread отвечающее за ссылку на объкт класса компонента, естественно при этом придется вызывать конструктор потока с Suspendet=true что бы назначить это свойство...
если планируется потоков больше чем один, работа с полями объекта должнабыть потокозащищенной, тоесть исключающая конфликт доступа к ресурсу...
← →
MadGhost (2004-01-25 19:01) [11]мдауж :), вот как раз это мне и не понятно :((((((((((((
← →
Palladin (2004-01-25 19:05) [12]давай без "это мне и не понятно"... что "это" то?
← →
MadGhost (2004-01-26 00:10) [13]ну все что ты описал, выше чуть-чуть, 1. создать свой конструктор, и все остальное :( плохо врубаюсь.
← →
Palladin (2004-01-26 00:23) [14]Мое личное мнение: в таком случае к потокам тебе прикасатся рано.
← →
MadGhost (2004-01-26 01:11) [15]спасиб, канешно :) эт я и сам так думаю, но научиться то хочется!!!
лано, буду читать, читать и ещё раз читать пока не дойдет :(((
уууу, тупой тупой Андрейка :((((((((((((((((((((((
лана сорри что отвлек. большое спасибо за тот ответ буду перемалывать.
← →
Юрий Зотов (2004-01-26 10:22) [16]> MadGhost © (26.01.04 01:11) [15]
Тут все довольно просто. Чтобы поток заработал (т.е., чтобы выполнился его метод Execute), его нужно просто создать - т.е. вызвать конструктор с параметром False (а если конструктор был вызван с параметром True, то создается объект TThread, но поток свою работу еще не начинает, до вызова Resume). Управление потоком во время его работы: Suspend - приостановить, Resume - возобновить, Terminate - прервать выполнение (последнее просто выставляет свойство Terminated, но само по себе ничего не прерывает - поэтому, чтобы реально прервать поток, в методе Execute надо проверять Terminated ручками). Завершение потока - это выход из метода Execute, при нем отрабатывает событие OnTerminate и, если выставлено свойство FreeOnTerminate, объект TThread самоуничтожается.
← →
panov (2004-01-26 12:33) [17]http://www.delphimaster.ru/cgi-bin/search.pl?words=Thread&n=1
← →
Bel (2004-01-26 14:21) [18]Рекомендую эти статьи. Мне, например, чтобы начать работать с потоками, хватило их.
http://www.delphimaster.ru/articles/thread/index.html
http://www.delphimaster.ru/articles/book/Chap11.pdf
← →
Zheks (2004-01-26 15:15) [19]Подскажите плз. почему виснит пример:
С:\Program Files\Borland\Delphi7\Help\Examples\Prgrsbar\ при запуске одного из потоков?
← →
MadGhost (2004-01-26 22:58) [20]не все дочитал до конца вторую ссылку к сожалению не смог пока почитать нету Acrobat Reader"a, ну например:
type TMyThread=class(TThread)
private
ffilename:string;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended:boolean;const filename:string);
end;
constructor TMyThread.Create(CreateSuspended:boolean;const filename:string);
begin
inherited Create(CreateSuspended);
ffilename:=filename;
end;
procedure TMyThread.Execute;
begin
//........................
end;
Form1=class(TForm)
MyThread:TMyThread;
public
ProgressBar1:TProgressBar;
....
end;
ну в общем и так далее, запускаем процесс передаем ему параметр в виде пути к файлу, значит тот шурстит и работает, вот самый главный вопрос, могу ли рулить переменными из формы в коорой я создал объект потока?
т.е. можно ли в потоке обновлять ProgressBar1
т.е. вот код программы как я себе это вижу....
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Gauges;
type
TMyThread=class(TThread)
protected
procedure Execute;override;
public
end;
type
TForm1 = class(TForm)
Button1: TButton;
Gauge1: TGauge;
myThread:TMyThread;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
myThread.Create(false);
end;
{ TMyThread }
procedure TMyThread.Execute;
var
i:integer;
begin
for i:=0 to 300000 do
Form1.Gauge1.Progress:=i;
end;
end.
программа не работает :(
еси я не правильно делаю, подскажите пожалуйста в чем моя криворукость, а еси нельзя так делать то подскажите способ как это осуществлять, т.е. может быть общую память или ещё че нибудь?
← →
y-soft (2004-01-27 07:19) [21]>MadGhost © (26.01.04 22:58) [20]
можно ли в потоке обновлять ProgressBar1
Таким образом, как у Вас, не стоит.
Во-первых. Ваш поток завершится практически мгновенно. Хотя бы введите после каждой итерации Sleep(...) и уменьшите количество итераций до разумного значения
Во-вторых. Так быстро ProgressBar перерисовываться не может
В-третьих. Код перерисовки в Вашем случае необходимо вызывать в первичном потоке. Используйте Synchronize или посылайте специальное сообщение Form1.Handle...
Примерно так:
...
const
WM_MYMSG = WM_USER + 400;
...
type
TForm1 = class(TForm)
...
private
procedure wmMyMsg(var Msg : TMessage); message WM_MYMSG;
...
end;
...
implementation
...
procedure TMyThread.Execute;
var
i:integer;
begin
for i:=0 to 100 do
begin
PostMessage(Form1.Handle,i,0);
Sleep(50);
end;
end;
...
procedure TForm1.wmMyMsg(var Msg : TMessage);
begin
Gauge1.Progress:= Msg.WParam;
end;
...
← →
Bel (2004-01-27 10:29) [22]> MadGhost © (26.01.04 22:58) [20]
> еси я не правильно делаю, подскажите пожалуйста в чем моя криворукость, а еси нельзя так делать то подскажите способ как это осуществлять...
Все-таки лучше побыстрее найди Acrobat Reader (не такая уж это редкая программа, на многих дисках есть) и почитай http://www.delphimaster.ru/articles/book/Chap11.pdf . Там есть ответы на твои вопросы, точно тебе говорю.
← →
MadGhost (2004-01-27 18:02) [23]>y-soft © (27.01.04 07:19) [21]
пишет Project1.exe reised exeption class EAccessViolation with message "Access ...." Stop process
в общем как я понял ошибка доступа :(
че делать? как быть?
← →
MadGhost (2004-01-27 18:15) [24]да нет, даже дело не в этом. пусть в TForm описана какая нить переменная в секции public, я хочу обнослять её через поток, это вабще реально? т.е. доступ из потока к переменным формы, потому что я пробывал у меня такая же ошибка доступа выходила :(
← →
Digitman (2004-01-27 18:26) [25]
> это вабще реально?
реально
> я пробывал у меня такая же ошибка доступа выходила
причина здесь, очевидно, иная
← →
MadGhost (2004-01-27 18:36) [26]>Digitman © (27.01.04 18:26) [25]
>> PostMessage(Form1.Handle,i,0);
я просто думаю откуда Thread знает Form1.Handle; или он действительно знает? или может переопределить Create, и передать ему Handle?
← →
Digitman (2004-01-27 18:42) [27]
> я просто думаю откуда Thread знает Form1.Handle
правильно думаешь
> или он действительно знает?
он что, телепат ?
> или может переопределить Create, и передать ему Handle?
как один из способов - вполне приемлемое решение
← →
y-soft (2004-01-27 19:18) [28]>MadGhost © (27.01.04 18:02) [23]
>>y-soft © (27.01.04 07:19) [21]
пишет Project1.exe reised exeption class EAccessViolation with message "Access ...." Stop process
в общем как я понял ошибка доступа :(
Это код, показывающий один из возможных подходов, всего лишь подсказку, а не рабочий код программы. Подход неоднократно проверенный. Возможно, поток начинает работать еще до того, как форма создана. Если бы поток "не знал" о Form1, то Вы не смогли бы скомпилировать свой проект
← →
MadGhost (2004-01-28 14:50) [29]я понял из за чего такая ошибка вылазила, я или описывал класс потока до формы, после в событии нажатия кнопки, описывал объект, и создавал его не правильно т.е.
procedure Form1.Button1Click(Sender: TObject)
var
MyThread1:TMyThread;
begin
MyThread.Create(false);
end;
объекта нету :) правильно так:
MyThread:=TMyThread.Create(false);
хотя я не описывал объект в последних тестовых программах, т.е. просто создавал класс потока внизу формы, после например в Button1Click делал
TMyThread.Create(false);
т.е. не объявлял никакого объекта, счас разбираюсь как же таки энтот поток правильно остановить :)
а то когда форму закрыть пытаешься тож ошибка выскакивает, и VCL я научился обновлять через Synchronize буду дальше мучать эти потоки пока полностью не поёму как они работаею :))))
всем спасибо кто принимал участик в обсуждении, большое спасибо
← →
DenisWW (2004-01-28 14:55) [30]а нежелаете
сюды заглянуть теперь
http://delphimaster.net/view/1-1075238622/
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.047 c