Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
4 / 4 / 0
Регистрация: 07.01.2012
Сообщений: 247

Не выполняется код в потоке

07.07.2012, 16:14. Показов 907. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать один поток, что бы основной код работал в нем, но, почему то, код не выполняется вообще! Я нажимаю на кнопку и всё - 0 внимания, форма не подвисла, кнопочки, как обычно, подсвечиваются, если на них навести... Помогите пожалуйста!
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   TNewThread = class(TThread)
     private
     protected
     procedure Execute; override;
     public
      constructor Create(CreateSuspended:Boolean);
   end;
var
  Form2: TForm2;
 
implementation
    uses unit1;
{$R *.dfm}
 
 constructor TNewThread.Create(CreateSuspended:Boolean);
 begin
   inherited Create(CreateSuspended);
 end;
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
begin
i:=1;
repeat
  i:=i+1;
  memo1.Lines.Add(inttostr(i));
until i=1000;
 
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
TNewThread.Create(false);
end;
 
procedure TNewThread.Execute;
var
i:integer;
begin
  i:=1;
  repeat
    i:=i+1;
    Form1.Memo1.Lines.Add(inttostr(i));
  until i=10000 ;
end;
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.07.2012, 16:14
Ответы с готовыми решениями:

TSkype - код не выполняется в потоке
Здравствуйте. У меня проблемка :) Написал код для добавления друзей в skype через api. Код работает, но не выполняется в потоке,...

Почему код после await-а зачастую выполняется не в том же потоке?
Привет! Вопрос именно в контексте ASP.NET MVC. Если такой код в контроллере: private Task Delay(int seconds) { return...

Распараллеливание: код выполняется еще медленнее чем в одном главном потоке
Здравствуйте! Хочу сделать распараллеливание участка кода, а именно этого: for (int i = 0; i < mas.length; i++) ...

6
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
07.07.2012, 16:28
Не надо из потока обращаться напрямую к визуальным компонентам формы. Используй Synchronize хотя бы. Или другие средства синхронизации.
0
4 / 4 / 0
Регистрация: 07.01.2012
Сообщений: 247
07.07.2012, 16:32  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Не надо из потока обращаться напрямую к визуальным компонентам формы. Используй Synchronize хотя бы. Или другие средства синхронизации.
То есть тут вот это лишнее?
Delphi
1
uses unit1;
Или
Delphi
1
Form1.memo1.lines.add(inttostr(i));
?
И как использовать синхронизацию, что то я не понял
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33404 / 21514 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
07.07.2012, 16:40
Цитата Сообщение от Melko Посмотреть сообщение
То есть тут вот это лишнее?
Нет, это не лишнее, если тебе надо из потока, описанного в этом модуле, взаимодействовать с контролами на Form1. Просто кое-чего не хватает для корректной работы.

Цитата Сообщение от Melko Посмотреть сообщение
как использовать синхронизацию
Например, вот так:
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
   TNewThread = class(TThread)
   private
      i : Integer;
      procedure DoIt;
   protected
      procedure Execute; override;
   public
      constructor Create(CreateSuspended : Boolean);
   end;
 
constructor TNewThread.Create(CreateSuspended:Boolean);
begin
   inherited Create(CreateSuspended);
end;
 
procedure TNewThread.DoIt;
begin
   Form1.Memo1.Lines.Add(inttostr(i));
end;
 
procedure TNewThread.Execute;
begin
   i := 1;
   repeat
      i := i + 1;
      Synchronize(DoIt); // Вот она, синхронизация
   until i = 10000;
end;
1
4 / 4 / 0
Регистрация: 07.01.2012
Сообщений: 247
07.07.2012, 17:32  [ТС]
Нет, всё равно не работает
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
   TNewThread = class(TThread)
     private
     i:integer;
     procedure doit;
     protected
     procedure Execute; override;
     public
      constructor Create(CreateSuspended:Boolean);
   end;
var
  Form2: TForm2;
 
implementation
    uses unit1;
{$R *.dfm}
 
 constructor TNewThread.Create(CreateSuspended:Boolean);
 begin
   inherited Create(CreateSuspended);
 end;
procedure TForm2.Button1Click(Sender: TObject);
var
i:integer;
begin
i:=1;
repeat
  i:=i+1;
  memo1.Lines.Add(inttostr(i));
until i=1000;
 
end;
 
procedure TNewThread.doit;
begin
 Form1.Memo1.Lines.Add(inttostr(i));
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
TNewThread.Create(false);
end;
 
procedure TNewThread.Execute;
begin
  i:=1;
  repeat
    i:=i+1;
    Synchronize(doit);
  until i=10000 ;
end;
end.
Добавлено через 40 минут
Ну так что? Поможет кто нибудь?
0
 Аватар для Mawrat
13116 / 5897 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
07.07.2012, 17:38
Цитата Сообщение от Melko Посмотреть сообщение
Нет, всё равно не работает
Тут видимо вот в чём дело. Код, выполняемый потоком, пишет строки в Form1.Memo1, а ты ждёшь, когда строки появятся в другом Мемо - в Form2.Меmo1.
---
И конструктор Craete() в коде не надо переопределять. В данном случае в этом нет смысла. И нужно запрограммировать поток так, чтобы связанный с ним объект был уничтожен после завершения метода Execute().
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
   TNewThread = class(TThread)
   protected
     FData : String;
     procedure DoIt;
     procedure Execute; override;
   end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TNewThread.DoIt;
begin
  Form2.Memo1.Lines.Add(FData);
end;
 
procedure TNewThread.Execute;
var
  i : Integer;
begin
  //Флаг, показывающий, что поток должен быть уничтожен автоматически
  //сразу после завершения метода Execute.
  FreeOnTerminate := True;
  i:=0;
  repeat
    Inc(i);
    FData := IntToStr(i);
    Synchronize(DoIt);
    Sleep(500); //Задержка выполнения текущего потока на 500 миллисекунд.
  until i >= 10 ;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  TNewThread.Create(false);
end;
1
4 / 4 / 0
Регистрация: 07.01.2012
Сообщений: 247
07.07.2012, 17:44  [ТС]
Хахаха я и не заметил, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.07.2012, 17:44
Помогаю со студенческими работами здесь

Не выполняется цикл во втором потоке
Необходимо протабулировать функцию F(x)=x*sin(x) на заданном интервале Действия цикла выполняются только 0-ым потоком и не переходят к...

Выполняется ли Invoke в другом потоке?
Здравствуйте, при многопоточности thread, когда выполняешь Invoke, Invoke выполняется в отдельном потоке?

Код не выполняется в одном месте, но выполняется в другом
Вот код процедуры: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; ...

Действие по таймеру выполняется в отдельном или общем потоке
Добрый день! Если я ставлю в программу таймер и на tick вешаю функцию, то будет ли на время выполнения этой функции останавливаться...

В отдельном потоке после функции accept() ничего не выполняется
Помогите, объясните, плиз, почему не работает! =( Сетевое приложение Windows Forms с использованием winsock2, написано в Microsoft Visual...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru