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

Реализовать счетчик, накапливающий значение от 1 до 10^9

15.06.2014, 01:04. Показов 2199. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
необходимо реализовать счетчик, накапливающий значение от 1 до 10^9. Каждый 100000 вычислений, счетчик должен увеличивать эл-т Progressbar на 1. Счетчик создать в виде отдельного класса, Реализовать запуск и остановку счетчика.

на форме 2 кнопки и прогрессбар. Не понимает в коде модуля потока, что за тип TProgressBar (Undeclared identifier:TProgressBar). Помогите пожалуйста справиться с этой проблемой.

код модуля потока Thread
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
unit Unit2;
 
interface
 
uses
  Classes;
 
type
  Potok = class(TThread)
  private
    pb : TProgressBar;
    i:LongInt;
    procedure Update;
  protected
    procedure Execute; override;
  public
    procedure Init(pb1:TProgressbar);
  end;
 
implementation
 
procedure Potok.Execute;
begin
  i:=1;
  while (i<1000000000) and not terminated do
  begin
    inc(i);
    if i mod 100000 = 0 then
      synchronize (Update);
  end;
end;
 
procedure Potok.Update;
begin
  pb.Position:=pb.Position+1;
end;
 
procedure Potok.init (pb1:TProgressbar);
begin
  Pb:=Pb1;
end;
 
end.
код основной программы
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, Unit2, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
type
  chet =class
  pb : TProgressBar;
  i : integer;
  st : Boolean;
  procedure start (pb1 : TProgressBar);
end;
 
var
  Form1: TForm1;
  ch1, ch2 : chet;
  c1,c2,c3: Potok;
 
implementation
 
{$R *.dfm}
 
procedure Chet.start(pb1 : TProgressBar);
begin
  while i<1000000000 do
  begin
    Inc(i);
    if  (i mod 100000) = 0 then
    pb1.Position:=pb1.Position+1;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ch1:=chet.Create;
  ch1.start(Form1.ProgressBar1);
  c1:=Potok.Create (True);
  c1.Init (Form1.ProgressBar1);
  c1.Resume;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 c1.Terminate;
end;
 
end.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.06.2014, 01:04
Ответы с готовыми решениями:

Реализовать счетчик в TextBox
Помогите пожалуйста. Мне нужно составить небольшую програмку,состоящую из нескольких pictureBox,в которых будут определенные картинки, но...

Как реализовать счётчик дней?
доброго времени суток ! обращаюсь с следующим вопросом : в C# Windows Forms (Visual Studio 2013) нужно написать счетчик дней что бы...

Как реализовать простейший счетчик (00 : 00)?
Пытаюсь сделать свой счетчик, по типу (00 : 00) Думал сделать что бы секунды считались с помощью свойства time, а затем если time добегает...

5
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
15.06.2014, 01:16
добавь в uses ComCtrls
1
0 / 0 / 0
Регистрация: 09.05.2014
Сообщений: 23
15.06.2014, 01:30  [ТС]
Arcor, спасибо, запустилось. А не могли бы вы проверить, правильно ли я решил задачу. Интересует само использование потоков. Его запуск и остановка. Просто при запуске прогрессбар быстро заполняется и программа подвисает, и я не могу ее остановить нажатием 2ой кнопки.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
15.06.2014, 08:38
что-то не обо всем рассказал
вот это кто?
Цитата Сообщение от anaxaim Посмотреть сообщение
procedure Chet.start(pb1 : TProgressBar);
begin
* while i<1000000000 do
* begin
* * Inc(i);
* * if *(i mod 100000) = 0 then
* * pb1.Position:=pb1.Position+1;
* end;
end;
нажимаем на кнопку, оно и выполняется, все висит
как только выполнится, создастся поток, запустится, будет делать то же самое, но "висеть" не будет

ошибки:
Delphi
1
2
3
4
5
ch1:=chet.Create;
  ch1.start(Form1.ProgressBar1);
  c1:=Potok.Create (True);
  c1.Init (Form1.ProgressBar1);
  c1.Resume;
должно быть
Delphi
1
2
3
4
5
6
7
8
ch1:=chet.Create;
  ch1.start(ProgressBar1);
  сh1.free;
  ProgressBar1.position := 0;
  c1:=Potok.Create (True);
  c1.freeOnTerminate:=true;
  c1.Init (ProgressBar1);
  c1.Resume;
Добавлено через 3 минуты
еще нужно написать
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.ThreadTerminated(Sender:TObject);
begin
  c1:=NIL;
end;
 
...
с1.OnTerminate:=ThreadTerminated;
c1.Resume;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if c1<>NIL then
    c1.Terminate;
end;
1
0 / 0 / 0
Регистрация: 09.05.2014
Сообщений: 23
15.06.2014, 17:48  [ТС]
krapotkin,

там в начале это я пробовал сначала без потоков делать через классы ))

все получилось, но есть еще несколько вопросов. Нужно организовать несколько потоков. Отображаю значения прогрессбара в эдиты, как бы мне замедлить заполнения прогрессбара, а то я остановить не успеваю его, как он уже полный? Что делает процедура TForm1.ThreadTerminated(Sender:TObject); и почему нельзя обойтись просто с1.Terminate? Как сделать, чтобы после остановки потока, при его запуске он продолжался с того места, где его остановили, а не с самого начала? Для лучшего понимания прикрепил файл с программой.

модуль потока
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
unit Unit2;
 
interface
 
uses
  Classes, SysUtils, StdCtrls, ComCtrls;
 
type
  Potok = class(TThread)
  private
    pb:TProgressBar;
    ed:TEdit;
    i:LongInt;
    procedure Update;
  protected
    procedure Execute; override;
  public
    procedure Init(pb1:TProgressbar; ed1:TEdit);
  end;
 
implementation
 
procedure Potok.Execute;
begin
  i:=1;
  while (i<1000000000) and not terminated do
  begin
    inc(i);
    if i mod 100000 = 0 then
      synchronize (Update);
  end;
end;
 
procedure Potok.Update;
begin
  if not Terminated then
  begin
    pb.Position:=pb.Position+1;
    ed.Text:= IntToStr(pb.Position);
  end;
end;
 
procedure Potok.init (pb1:TProgressbar; ed1:TEdit);
begin
  Pb:=Pb1;
  ed:=ed1;
end;
 
end.

модуль формы:

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, Unit2, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    ProgressBar1: TProgressBar;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Button4: TButton;
    ProgressBar2: TProgressBar;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ThreadTerminated(Sender:TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  c1,c2: Potok;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ProgressBar1.Position:=0;
  c1:=Potok.Create (True);
  c1.FreeOnTerminate:=True;
  c1.Init (ProgressBar1,Edit1);
  c1.Resume;
end;
 
procedure TForm1.ThreadTerminated(Sender:TObject);
begin
  c1:=nil;
  c2:=nil;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  if c1<>nil then
   c1.Terminate;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  ProgressBar2.Position:=0;
  c2:=Potok.Create (True);
  c2.FreeOnTerminate:=True;
  c2.Init (ProgressBar2,Edit2);
  c2.Resume;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
  if c2<>nil then
   c2.Terminate;
end;
 
end.
Вложения
Тип файла: rar потоки.rar (167.7 Кб, 2 просмотров)
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,656
Записей в блоге: 21
15.06.2014, 21:51
Лучший ответ Сообщение было отмечено anaxaim как решение

Решение

1. совет - c1,c2: Potok; убрать в раздел private.
Негоже методам класса обращаться к глобальным переменным. Нарушается принцип инкапсуляции.
2. добавим 10 мсек простой в цикл потока
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure Potok.Execute;
begin
  i:=1;
  while (i<1000000000) and not terminated do
  begin
    sleep(10);
    inc(i);
    if i mod 100000 = 0 then
      synchronize (Update);
  end;
end;

3. ThreadTerminated это простая процедура, вешаем ее на событие потока OnTerminate. Т.е. при разрушении он вызовет ThreadTerminated чтобы сообщить форме, что переменную нужно очистить. Процедура Terminate всего лишь устанавливает переменную Terminated, чтобы ее можно быль проверять в цикле в Execute, как тут и написано.
4. несколько потоков это не сложнее одного. случай для двух потоков у тебя написан. убери ProgressBar2.Position:=0; при создании потока и он не будет сбрасываться в 0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2014, 21:51
Помогаю со студенческими работами здесь

Подскажите пожалуйста реализовать счетчик на php
Подскажите пожалуйста реализовать счетчик... задача такая, нужен счетчик который добавляет каждые пол секунды +0.1, он должен работать не...

Реализовать счетчик страниц, отправленных на принтер
Подскажите, можно ли реализовать на нет-технологии счетчик страниц, которые отправляют на печать на принтер? (либо уже просто на vb 6.0)

Реализовать счетчик вопросов в программе тестирования
Доброго времени суток, мне нужная вот такая помощь: есть программа, в которой нужно, чтобы с каждым новым вопросом работал щетчик... в...

Реализовать счетчик монет и вывод завершения игры
Помоги завершить код игры если не сложно 1) Нужно реализовать счетчик монет Сколько есть и Осталось (Lebel) 2) Нужно сделать вывод...

AHDL. Накапливающий сумматор
Здравствуйте,помогите,пожалуйста нарисовать функциональную схему накапливающего сумматора конвейерной архитектуры (6...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru