Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/84: Рейтинг темы: голосов - 84, средняя оценка - 4.64
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93

Создание потоков через CreateThread

09.10.2010, 18:07. Показов 16107. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди, Расскажите что такое потоки в Delphi, которые делаются с помощью команды createthread. И нафиг они нужны ??? пример покажите, а то заманался с учебниками, какой только хрени ни находил нормально показать никто не может.


*HELP* *HELP*
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.10.2010, 18:07
Ответы с готовыми решениями:

Создание потока через CreateThread
Доброго времени суток! Помогите разобраться. Мне нужно создать поток с помощью WinAPI-функции CreateThread, но у меня никак не получается...

Создание потоков через пул
Здравствуйте, подскажите пожалуйста вот такое задание для создания потоков используйте пул вот код задачи для потока double x =...

Создание потоков Thread через цикл
Вот полный код программы,где через t задается условное количество выполнений циклов, которые погружают поток в сон, тоесть если я задам...

46
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
12.10.2010, 16:59
Студворк — интернет-сервис помощи студентам
kardinal94, блин, тебе реально лень почитать документацию по классу???
У класса есть свойство Terminated, также есть процедура Terminate, которая изменяет это свойство, далее в процедуре Execute в цикле (обычно при работе с потоками есть циклы, иначе нужда в потоке пропадает), проверяете это свойство, и завершаете процедуру, все поток остановлен. Далее с помощью Free его разрушаете (но это уже из общего понятия объекта и класса)
Ps можете похимичь со свойством FreeOnTerminate и тогда удалять объект ручками не нужно будет...
0
Неадекват и грубиян
 Аватар для pryda
310 / 297 / 301
Регистрация: 22.02.2010
Сообщений: 647
12.10.2010, 17:12
приведу простой пример (вместо createthread используйте beginthread. почему? -> www.google.ru )

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var  i:integer=0;
  thread1,thread2,id:longword;
 
procedure test;
var k:Integer;
begin
  for k:=0 to 10 do
  Form1.label1.Caption:=IntToStr(k);
EndThread(0);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
thread1:=beginthread(nil,0,addr(test),nil,0,id);
thread2:=beginthread(nil,0,addr(test),nil,0,id);
end;
при таких данных у вас программа обработает процедуру test в два потока. однако если вы в процедуре измените значение 10 на, например, 10000000 вот тут возникнут проблемы, связанные с вылетом программы. их решение - использование критических секций, но это уже совсем другой вопрос.
теперь про завершение потока. вы можете использовать terminatethread, но используйте ТОЛЬКО В КРАЙНЕМ СЛУЧАЕ!! лучше используйте waitforsingleobject.
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
12.10.2010, 18:34  [ТС]
Я как бы не против использовать beginthread но условие такое что надо createthread. И вот мы создали этот поток, что в нем хранится ???
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
12.10.2010, 20:28
Nehemian, та ничего в нем не хранится, мы ж апи использовали, тут нет объектов...
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
12.10.2010, 21:01  [ТС]
Блин, тогда нафиг он нужен ??? я ниче не понимаю(((((((((
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
12.10.2010, 23:46
Цитата Сообщение от Nehemian Посмотреть сообщение
я ниче не понимаю
Что мешает почитать, что такое потоки и для чего они нужны, а не ссылатся на "умственную неполноценность"? Попробуйте, помогает.
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
13.10.2010, 01:03
pryda, простите, а можно увидеть завершение потока через waitforsingleobject ??? А то чет либо я сошел с ума, либо вы гений, но такое я слышу впервые:
Цитата Сообщение от pryda Посмотреть сообщение
вы можете использовать terminatethread, но используйте ТОЛЬКО В КРАЙНЕМ СЛУЧАЕ!! лучше используйте waitforsingleobject.
0
Неадекват и грубиян
 Аватар для pryda
310 / 297 / 301
Регистрация: 22.02.2010
Сообщений: 647
13.10.2010, 13:03
имеется ввиду дождаться завершения, потом клоузхендл
0
13.10.2010, 19:58

Не по теме:

pryda, так так и излагайте, а не вводите в заблуждение (особенно новичков!), и вообще это к тебе особо не относится (это больше к синхронизации относится...)

0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
15.10.2010, 22:12  [ТС]
Блин, я в печали, ниче не придумал, Люди Помогите
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
21.10.2010, 19:24  [ТС]
Люди посмотрите
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  n,f,i:integer;
  ID:THandle;
 
implementation
 
function Inkrement(n:integer):integer;
 var r:integer;
 begin
   for r:=1 to n do
     begin
     Result:=(n);
     n:=n+1;
     end;
 end;
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  n:=strtoint(edit1.text);
  f:=strtoint(edit2.Text);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.SelText:=inttostr(Inkrement(n)) ;
for i:=1 to f do
memo1.SelText:=inttostr(createthread(nil,0,@Inkrement,nil,0,ID));
 
for i:=f downto 1 do
memo2.SelText:=floattostr(createthread(nil,0,@Inkrement,nil,0,ID));
 
 
end;
 
end.
Сделал вот такую хреновину, выводит я не пойму что, вроде работает. Как сделать так чтобы он не непонятные числа выводил, а чтобы результат получался.
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
21.10.2010, 19:43
н-да, честно говоря жуть получилась....
Итак по порядку
1. Я не нашел возможность прикрепления функции в качестве процедуры потока, поэтому меняем
Delphi
1
function Inkrement(n:integer):integer;
на
Delphi
1
procedure Inkrement(n:integer);
2. Вы плохо читали документацию (хотя нужно было прочитать всего лишь про одну функцию!!!!), а в ней сказано, что результат CreateThread - объект типа Thandle, а не результат функции поэтому меняем
Delphi
1
memo1.SelText:=inttostr(createthread(nil,0,@Inkrement,nil,0,ID));
на
Delphi
1
ThreadHandle:=createthread(nil,0,@Inkrement,{возможно здесь нужно @}ThreadParam,0,ThreadID));
где:
Delphi
1
2
3
ThreadHandle: THandle; // хендл потока
ThreadParam: integer; // параметр передаваемый функции потока
ThreadID: dword; // идентификатор потока
3. Теперь чтобы наша функция потока могла все-таки возвращать значение меняем:
Delphi
1
procedure Inkrement(n:integer);
на
Delphi
1
procedure Inkrement(var n:integer);
В принципе основные ошибки я исправил, далее думайте сами ибо я пока не вижу смысла в сделанной программе....
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
21.10.2010, 20:13  [ТС]
эх... Да и не должно быть смысла в программе((( нуна потоки вывести(((

Добавлено через 4 минуты
Теперь она перестала работать

Добавлено через 29 секунд
У меня хоть работала не так, но не крашилась

Добавлено через 33 секунды
Что делать ???

Добавлено через 2 минуты
Цитата Сообщение от Vas-e-na Посмотреть сообщение
{возможно здесь нужно @}ThreadParam
зачем нам это ???
Параметр LpParameter имеет тип Pointer и используется для передачи функции потока какого-либо инициализирующего значения. Это что значит ???

Добавлено через 6 минут
Цитата Сообщение от Vas-e-na Посмотреть сообщение
ThreadHandle:=createthread(nil,0,@Inkrem ent,{возможно здесь нужно @}ThreadParam,0,ThreadID));

это нам зачем ??? если мы не можем узнать что в ThreadHandle ??? или мы должны вызывать эту ThreadHandle ??? что нам того что это есть ???

Добавлено через 8 минут
На сколько я понял в потоке должна вызываться процедура и получаться какой-то результат, Я не против, поток вызывется, крашиться переодически,эт ладно, Но как вывести результак которые получается в этом потоке ????
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
21.10.2010, 20:43
lpParameter
[in] Указатель на переменную, которая передается в поток.
Ваша n в процедуре;
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - дескриптор нового потока.
Это то с помощью чего можно управлять потоком
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
21.10.2010, 20:50  [ТС]
Почему крашиться ???
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
21.10.2010, 21:26
потомучто потоки надо завершать

Добавлено через 24 секунды
для этого хендл в принципе и нужен

Добавлено через 26 секунд
потом, код в студию + ошибку, иначе я буду строить только предположения...
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
21.10.2010, 22:22  [ТС]
Delphi
1
2
3
4
ResumeThread(ThreadHandle);
ThreadHandle:=createthread(nil,0,@Inkrement,@n,CREATE_SUSPENDED,ID);
 terminatethread(ThreadHandle,0);
 suspendthread(ThreadHandle);

все равно крашиться, зае**** меня это

нах все это нуно


Ладно, это эмоций. Может взять какую-нибудь другую процедуру ???
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
21.10.2010, 22:52
во первых функции которые вы перечислили надо использовать в таком порядке:
1. CreateThread
2. SuspendThread
3. ResumeThread
4. TerminateThread
и порядок менять нельзя, разве что (3) можно использовать перед (2) + связку 2-3 можно использовать много раз...
Во вторых ошибку то мне покажут???
и в-третьих весь код пожалуйста если не сложно (желательно НЕ файлом...)
0
 Аватар для Nehemian
15 / 15 / 4
Регистрация: 27.12.2009
Сообщений: 93
22.10.2010, 12:46  [ТС]
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Edit2: TEdit;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  n,f,i:integer;
  ThreadHandle2,ThreadHandle: THandle;
  ID:DWord;
 
implementation
 
procedure Inkrement(var n:integer);
 var r:integer;
 begin
   for r:=n to n+n do
     begin
 
     n:=n+1;
     end;
 end;
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  n:=strtoint(edit1.text);
  f:=strtoint(edit2.Text);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
//memo1.SelText:=inttostr(Inkrement(n)) ;
ResumeThread(ThreadHandle);
ThreadHandle:=createthread(nil,0,@Inkrement,@n,CREATE_SUSPENDED,ID);
//ThreadHandle.Terminate  ;
//TerminateThread(ThreadHandle);
//ThreadHandle.free;
 
 suspendthread(ThreadHandle);
for i:=1 to f do
memo1.SelText:=floattostr(createthread(nil,0,@Inkrement,nil,CREATE_SUSPENDED,ID));
 
for i:=f downto 1 do
memo2.SelText:=floattostr(createthread(nil,0,@Inkrement,nil,0,ID));
 
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
ThreadHandle2:=createthread(nil,0,@Inkrement,@n,CREATE_SUSPENDED,ID);
 suspendthread(ThreadHandle2);
 ResumeThread(ThreadHandle2);
 TerminateThread(ThreadHandle2,0);
end;
 
end.


Вот код))) не крашиться, но не понятно что делает)))
а как результат вывести ???
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
22.10.2010, 13:21
Nehemian, все что в Button2Click выкинте, прочитайте еще раз что я вам писал и напишите еще раз.
Результат, чс результатом все просто, вы в поток передаете n (в процедуре потока n-меняется), так вот эта n и есть результат, т.е. все что вам надо, это по завершении работы потока её вывести...
PS учитывая что выбрано для тестов и как реализовано, будет очень тяжело наблюдать результат
PPS и TerminatreThread принудительно завершает поток!!! (даже если он не закончил работу)

Поэтому, мое личное мнение, сделайте на одну кнопку создание потока, на другую завершение, в качестве процедуры потока возьмите бесконечный цикл и там что-то делайте, а третьей кнопкой делайты вывод результата(я бы предложил по таймеру делать вывод), предварительно только приостановите поток, а после запустите...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.10.2010, 13:21

Создание двух потоков, упорядоченных через переменную.
Создать 2 потока, которые кпордочиваются через переменную, 2 потока работают одновременно

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

Вернуть значение функции, запущенной через CreateThread
У меня есть некоторая функция, которая через CreateProcess() запускается, но мне нужно как-то получать значение, которая она вычисляет...

Создание приложения, использующего функцию CreateThread для создания потока
Нужно создать проект консольного приложения, используя пример кода (см. ниже), использующего функцию CreateThread для создания потока....

Как быть с потоками, которые создаются через CreateThread?
Для синхронизации потока с основной формой используется Synchronize при работе с TThread. Как быть с потоками, которые создаются через...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru