Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

CreoVision



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Как осуществить доступ , например, к процедуре, изменить значение переменнной  в потоке???

Всего записей: 117 | Зарегистр. 14-02-2004 | Отправлено: 12:34 02-06-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Пример использования потока:
 

Цитата:
unit Unit5;
 
interface
 
uses
  Classes, Windows, winsvc;
 
type
  SecondTheard = class(TThread)
  private // В эту секцию ты можешь добавлять свои процедуры, которые хочешь использовать в потоке. У меня добавлена процедура sstatus;
    procedure sstatus;
  protected
    procedure Execute; override; //Это процедура, которая выполняется при запуске потока;
  end;
 
implementation
 
Uses Unit1;
 
procedure SecondTheard.Execute;
var
 hEvent:Thandle;
begin
hEvent:= CreateEvent(nil, true, false, 'getservice');
 while not terminated do begin
  WaitForSingleObject(hEvent, 5000);
  synchronize(sstatus);
 end;
end;
 
procedure SecondTheard.sstatus;
begin
if SERVICE_RUNNING = MainForm.ServiceGetStatus(nil, 'df')=false then MainForm.Indicate(true)
else MainForm.Indicate(false);          
end;
 
end.

 
Это Unit самого потока. В главном юните нужно добавить:
 

Цитата:
...
 
implementation
uses Unit5 // Добавил сюда Unit моего потока. В данном случае Unit5;
 
...
 
procedure TMainForm.FormCreate(Sender: TObject);
var
...
st: SecondTheard;
begin
...
st:=SecondTheard.create(false); // Создаем поток. В скобках указано, что поток сразу начинает выполнения. В противном случае нужно поставить true, а для последующего запуска потока использовать метод Resume;
st.Priority:=tpLowest; // Задаем приоритет. Может принимать значения: tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical;
st.freeonterminate:=true; // Если значение true, то после выполнения процедуры Execute поток самоуничтожится;
end;

 
Чтобы изменить значение переменной в потоке, добавь переменную потока в раздел public, после чего ты сможешь изменить её из любого юнита твоей программы, к которому подключен юнит потока.

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 12:45 02-06-2005 | Исправлено: Larry Laffer, 12:51 02-06-2005
CreoVision



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Larry Laffer
 

Цитата:
 
procedure SecondTheard.Execute;  
var  
 hEvent:Thandle;  
begin  
hEvent:= CreateEvent(nil, true, false, 'getservice');  
 while not terminated do begin  
  WaitForSingleObject(hEvent, 5000);  
  synchronize(sstatus);  
 end;  
end;  
 
procedure SecondTheard.sstatus;  
begin  
if SERVICE_RUNNING = MainForm.ServiceGetStatus(nil, 'df')=false then MainForm.Indicate(true)  
else MainForm.Indicate(false);          
end;  
 
end.

 
Прокомментируй плз... А то не понятно все полностью...
Сенкс.
 

Всего записей: 117 | Зарегистр. 14-02-2004 | Отправлено: 12:53 02-06-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
CreoVision, то, что заключено между begin и end процедур - это не имеет значения. Просто я скопировал пример моей программы.
 

Цитата:
procedure SecondTheard.Execute;
begin
... // Сюда пишешь код, который будет выполняться при запуске потока;
synchronize(sstatus); // Выполняется процедура sstatus, объявленная в секции private; Это для примера добавления новых процедур в поток. Если новых процедур, то и данной строки в коде быть не должно.
end;
 
procedure SecondTheard.sstatus;  
begin  
... // Сюда пишешь все, что угодно;
end;

 
Неизменчивой здесь остается процедура Execute, которая выполняется при запуске потока.

----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 13:01 02-06-2005 | Исправлено: Larry Laffer, 13:02 02-06-2005
CreoVision



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
сенкс, помог очень, спасибо, тепер ссылка розобраться надо было бы...

Всего записей: 117 | Зарегистр. 14-02-2004 | Отправлено: 13:09 02-06-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
CreoVision, могу скинуть документацию с примерами по программированию потоков. Если желаешь, оставляй мыло в PM.


----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 13:15 02-06-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CreoVision

Цитата:
1.Обьясните пожалуйста, зачем нужны потоки, что это такое?  

Поток, это код который выполняется на процессоре. Программа может быть как однопоточная, так и много поточная. Каждая программа имеет как минимум один поток.
Потоки нужны для увеличения скорости работы программы путем распаралеливания. (т.е. если у тебя несколько процессоров, и многопоточная программа, ОС может расспланировать их работу одновременно на нескольких процессорах (один поток-один процессор)). Потоки нужны для сокращения накладных расходов при планировании задач ОС.
 
 

Цитата:
Чего можно добиться используя потоки...  

Уменьшение "тормознутости" своей программы при выполненни некоторых операций. В качестве примера обычно приводят проверку орфографии, постановку в очередь на печать.  

Цитата:
Зачем чтение из потока, запись в поток???  

Это относится к вопросам синхронизации данных. Т.е. В какой-то точке программы ты решаешь использовать поток, и передаешь потоку входяшие данные, когда поток отработает, ты забираешь данные.
 

Цитата:
2.Обясните что такое указатели и зачем они нужни,  

Скажем так, у тебя есть массив кил так на 20 (или другие данные). Тебе нужно их передавать в процедуры/функции. Если у тебя нет указателей, тогда ты вынужден копировать массив каждый раз, а если есть, ты передаешь указатель на него (обычно 4 байта).  Вот и прикинь разницу во времени выполнения.  

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 13:07 03-06-2005
CreoVision



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vserd

Цитата:
Цитата:2.Обясните что такое указатели и зачем они нужни,    
 
Скажем так, у тебя есть массив кил так на 20 (или другие данные). Тебе нужно их передавать в процедуры/функции. Если у тебя нет указателей, тогда ты вынужден копировать массив каждый раз, а если есть, ты передаешь указатель на него (обычно 4 байта).  Вот и прикинь разницу во времени выполнения.  

 
Т.Е. при передаче параметров массив копируется???
 

Всего записей: 117 | Зарегистр. 14-02-2004 | Отправлено: 13:33 03-06-2005
EZH



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
CreoVision
Кстати, на заметку, потоками в программировании называют ещё одно понятие - нечто, куда направляются данные (или извлекаются). Тоже говорят - писать в поток и читать из потока.
Наверняка ты слышал про перенаправление вывода данных вместо экрана, например, на принтер или в файл. Можно в блок памяти.
В Delphi тоже очень активно используются, например для сохранения свойств компонентов (обычно это процедуры SaveToStream/LoadFromStream).
 
Чтобы не путать эти понятия, часто наследников TThread стараются называть по русски "нитями", а наследников TStream - потоками.

Всего записей: 1738 | Зарегистр. 02-09-2004 | Отправлено: 14:10 03-06-2005 | Исправлено: EZH, 14:11 03-06-2005
evle



1 + int rand(100);
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

CreoVision

Цитата:
Зачем чтение из потока, запись в поток???    

У меня такое ощущение, что тут опять смешали два понятия:  

Цитата:
thread 1) поток; нить ( создаваемый многозадачной операционной системой объект (один или несколько) внутри процесса, который выполняет инструкции программы; потоки позволяют осуществлять параллельное выполнение процессов и одновременное выполнение одним процессом различных частей программы на различных процессорах )

и

Цитата:
stream 1) поток - bit stream - bitstream - data stream - input stream - output stream - serial stream 2) поток ( в технологиях на основе COM - аналог файла в структурированном хранилище ( structured storage ) )

Когда говорят о чтении из потока, обычно имеют в виду именно stream. Вообще, в последнне время, к счастью, стали отходить от термина "поток" применительно к первому случаю как раз из-за этой путаницы.

----------
For every complex problem, there is a solution that is simple, neat, and wrong.

Всего записей: 2110 | Зарегистр. 03-02-2005 | Отправлено: 14:18 03-06-2005
Dim2004

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CreoVision

Цитата:
Т.Е. при передаче параметров массив копируется???  

Эта... RTFM, в общем :
 
"A value parameter acts like a local variable that gets initialized to the value passed in the procedure or function call. If you pass a variable as a value parameter, the procedure or function creates a copy of it; changes made to the copy have no effect on the original variable and are lost when program execution returns to the caller.
 
A variable parameter, on the other hand, acts like a pointer rather than a copy. Changes made to the parameter within the body of a function or procedure persist after program execution returns to the caller and the parameter name itself has gone out of scope."

Всего записей: 222 | Зарегистр. 11-05-2004 | Отправлено: 14:32 03-06-2005
2Polkan



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ТребуеЦа написать прогу, чтобы она редактировала файл *.ini а именно, заменяла Н-ную строку на свою, потом созраняла файл... почему-то AssignFile не подцепляет ini'шник :(

Всего записей: 435 | Зарегистр. 20-11-2004 | Отправлено: 16:17 03-06-2005
Larry Laffer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2Polkan, хех. Читай доку по IniFiles


----------
Save The Planet -- Kill YourSelf!
http://larry.nxt.ru

Всего записей: 604 | Зарегистр. 09-10-2004 | Отправлено: 16:30 03-06-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
2Polkan
в хелпе на тему iniFile почитай

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 16:31 03-06-2005
Z MeZe



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Какой бы мне функцией конвертировать String в Double.
Вот что есть:
большой (порядка 1 гига и >) файл, где прописаны числа в формате #.###
Нужно перекидать их в число, но чтобы не менять точки на запятые.

Всего записей: 455 | Зарегистр. 09-02-2004 | Отправлено: 17:26 03-06-2005
pand



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Z MeZe
RTFM function StrToFloat(const S: string; const FormatSettings: TFormatSettings): Extended; overload;

Всего записей: 1529 | Зарегистр. 03-08-2004 | Отправлено: 18:15 03-06-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Выражение:  
 

Цитата:
FPerformGetRecordCount: function: integer of object;

 
Perform - что-то конкретное обозначает или это просто назнание переменной?

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 13:40 05-06-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ViktorSila
ну захотелось так человеку переменную назвать. Мож он какой-то глуьокий смысл и вложил, но если переименуеш, то ничего не поменяется. Только буковку F желательно оставить - это соглашение об наименованиях

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 13:47 05-06-2005
ViktorSila

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
Как я понимаю F, T, On желательно придерживаться, Perform - это чисто часть название переменной.

Всего записей: 54 | Зарегистр. 04-02-2005 | Отправлено: 15:15 05-06-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ViktorSila
Да, их стоит придерживаться, так как по них среда может корректно "дописывать" реализации методов и свойств. И другим программистам сразу понятно о чём идёт дело.

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:47 05-06-2005
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru