Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
7-16765
Zheks
2003-11-17 11:18
2004.02.06
Есть ли компонент для программирования портов?


1-16371
Goida
2004-01-23 19:22
2004.02.06
Еще о Word


7-16781
User_OKA
2003-11-21 08:53
2004.02.06
Получение информации о выполняющихся в системе процессах


3-16193
chtr
2004-01-13 14:04
2004.02.06
Как запросом вставить данные из mdb в таблицу MSSQL?


1-16379
Olphi
2004-01-23 18:13
2004.02.06
Как выровнять текст по ширине в TMemo или TRichEdit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский