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

Программа с потоками. Неправильное заполнение StringGrid

05.05.2013, 14:47. Показов 1129. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Делаю следующую задачу. Имеется три потока.

В первом потоке, буфер размером [1..8] заполняется случайными цифрами в диапазоне 1..100000.

Во втором потоке, каждое значение элемента буфера первого потока входит как аргумент в вычисляемую функцию.18*cos(3.14*x), и вычисленное значение функции заносится во второй буфер, размером [1..8].

В третьем потоке элементы второго буфера выводятся в строку StringGrid, в котором 12 строк, то есть вышеперечисленные действия должны повториться 12 раз, чтобы заполнить всю таблицу.

Потоки создавал через мастер. поэтому, кроме основного модуля (Unit1), имеются соответствующие МОДУЛИ Unit2,Unit3,Unit4. Проблема в том что таблица не заполняется правильно.
ниже привожу код и скриншот таблицы, которая коряво заполнена.

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
//основной модуль
var
  Form1: TForm1;
  Rbuf:array [1..N] of integer;//буфер для заполнения случайными числами
  Cbuf:array [1..N] of extended;//буфер для вычисления функции
  s,l:integer;
implementation
 
uses Unit2, Unit3, Unit4;
 
{$R *.dfm}
 
 
procedure TForm1.Button1Click(Sender: TObject);
 var i:integer;
begin
  s:=0;
  repeat
  inc(s) ; //номер текущей строки stringgrid
  FirstPotok1:=FirstPotok.Create(false);
  Sp:=SecondPotok.Create(false);
  ThridPotok:=TTp.Create(false);
  until s=12;
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
75
76
//модуль первого потока
unit Unit2;
 
interface
 
uses
  Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF},Math,SysUtils,Dialogs;
 
type
  FirstPotok = class(TThread)
  private
    procedure SetName;
  protected
    procedure Execute; override;
  end;
  var FirstPotok1:FirstPotok;
implementation
 
uses Unit1;
 
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure FirstPotok.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}
 
{ FirstPotok }
 
procedure FirstPotok.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'FirstPotok';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
 
  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;
 
procedure FirstPotok.Execute;
var i:integer;
begin
  SetName;
  { Place thread code here }
 
 randomize;
 for i:=1 to N do
 begin
  Rbuf[i]:=1+Random(100000);  end;
 Form1.Label1.Caption:=IntToStr(l)
 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
75
76
77
78
//модуль второго потока
unit Unit3;
 
interface
 
uses
  Classes {$IFDEF MSWINDOWS} , Windows {$ENDIF},Math,Dialogs,SysUtils;
 
type
  SecondPotok = class(TThread)
  private
    procedure SetName;
  protected
    procedure Execute; override;
  end;
  var Sp:SecondPotok;
implementation
 
uses Unit2, Unit1;
 
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure SecondPotok.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}
 
{ SecondPotok }
 
procedure SecondPotok.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := 'SecondPotok';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
 
  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;
 
procedure SecondPotok.Execute;
var i,x:integer;
 y:extended;
begin
  SetName;
  { Place thread code here }
   for i:=1 to N do
   begin
    x:=Rbuf[i];//извлекаем число из первого буфера
    y:=18*cos(3.14*x); //вычисляем значение функции
 
    Cbuf[i]:=y; //заполняем второй буфер
      end;
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
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
//модуль третьего потока
unit Unit4;
 
interface
 
uses
  Classes {$IFDEF MSWINDOWS} , Windows,SysUtils {$ENDIF};
 
type
  TTp = class(TThread)
  private
    procedure SetName;
  protected
    procedure Execute; override;
  end;
 
 var ThridPotok:TTp;
  implementation
 
uses Unit1, Unit3;
 
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure TTp.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}
 
{ TTp }
 
procedure TTp.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := '';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
 
  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;
 
procedure TTp.Execute;
  var i:integer;
      t,a:extended;
      buf:array [1..N] of extended;
      sort:booLEAN;
begin
  SetName;
  { Place thread code here }
   //inc(s);
  for i:=1 to N do
   begin
    //создание копии второго буфера для сохранения его уникальности
    t:=Cbuf[i];
    buf[i]:=t;
    //Cbuf[i]:=0;
    end;
    //сортировка по возрастанию буфера-копии
     SORt:=true;
 
     while sort=true do
      begin
       SORt:=false;
        for i:=1 to N-1 do
          begin
            if buf[i]>buf[i+1]  then
             begin
               a:=buf[i];
               buf[i]:=buf[i+1];
               buf[i+1]:=a;
               sort:=true;
             end;
 
          end;
      end;
  //вывод на экран
  for i:=1 to N do form1.StringGrid1.Cells[i-1,s] :=FloatToStr(buf[i]);
   end;
end.
Миниатюры
Программа с потоками. Неправильное заполнение StringGrid  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2013, 14:47
Ответы с готовыми решениями:

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

Заполнение StringGrid
Добрый день. Проблема в следующем. Есть StringGrid размера 16х16 нужно заполнить каждый второй столбец числами по порядку. Как это...

StringGrid заполнение
Привет, всем! Имеется StringGrid(т.е. квадратная матрица) по главной диагонали прописываются единицы, необходимо сделать так, чтобы при...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
05.05.2013, 15:16
Delphi
1
Form1.Label1.Caption:=IntToStr(l)
в Execute потока? В мусор сразу, это работать не будет (точно так же, как и обновление ячеек грида в третьем потоке) без синхронизации. А ведь у тебя даже в комментариях остался текст, который генерируется при создании потока, о том, что надо использовать Synchronize. А вот это:

Delphi
1
x:=Rbuf[i];//извлекаем число из первого буфера
вообще перл. Извлекаем. А ты уверен, что оно там уже есть, т.е., что первый поток уже успел его туда занести?
0
1 / 1 / 0
Регистрация: 24.02.2013
Сообщений: 30
06.05.2013, 14:33  [ТС]
все буфера заполняются нормально, но про синхронизацию я забыл, буду пробовать.

Добавлено через 22 часа 15 минут
изменил код третьего потока, то есть обновление Stringgrid при помощи синхронизации, все равно таблица вся не заполняется
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
unit Unit4;
 
interface
 
uses
  Classes {$IFDEF MSWINDOWS} , Windows,SysUtils {$ENDIF};
 
type
  TTp = class(TThread)
    private
      st:string;
     procedure SetName;
     procedure UpdateStrinGrid;
 
  protected
    procedure Execute; override;
  end;
 
 var ThridPotok:TTp;   buf:array [1..8] of extended;
  implementation
 
uses Unit1, Unit3;
 
{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,
 
      Synchronize(UpdateCaption);
 
  and UpdateCaption could look like,
 
    procedure TTp.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }
 
{$IFDEF MSWINDOWS}
type
  TThreadNameInfo = record
    FType: LongWord;     // must be 0x1000
    FName: PChar;        // pointer to name (in user address space)
    FThreadID: LongWord; // thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // reserved for future use, must be zero
  end;
{$ENDIF}
 
{ TTp }
 
procedure TTp.SetName;
{$IFDEF MSWINDOWS}
var
  ThreadNameInfo: TThreadNameInfo;
{$ENDIF}
begin
{$IFDEF MSWINDOWS}
  ThreadNameInfo.FType := $1000;
  ThreadNameInfo.FName := '';
  ThreadNameInfo.FThreadID := $FFFFFFFF;
  ThreadNameInfo.FFlags := 0;
 
  try
    RaiseException( $406D1388, 0, sizeof(ThreadNameInfo) div sizeof(LongWord), @ThreadNameInfo );
  except
  end;
{$ENDIF}
end;
 
procedure TTp.UpdateStrinGrid;
 var i:integer;
 begin
 
   for i:=1 to N do
      begin
 
        Form1.StringGrid1.Cells[i-1,s]:=st ;
      end;
 end;
 
procedure TTp.Execute;
  var i:integer;
      t,a:extended;
 
      sort:booLEAN;
begin
  SetName;
  { Place thread code here }
   //inc(s);
  for i:=1 to n do
   begin
    //создание копии второго буфера для сохранения его уникальности
    t:=Cbuf[i];
    buf[i]:=t;
    //Cbuf[i]:=0;
       st:=floattostr(buf[i]) ;
    end;
    //сортировка по возрастанию буфера-копии
     SORt:=true;
 
     while sort=true do
      begin
       SORt:=false;
        for i:=1 to N-1 do
          begin
            if buf[i]>buf[i+1]  then
             begin
               a:=buf[i];
               buf[i]:=buf[i+1];
               buf[i+1]:=a;
               sort:=true;
             end;
 
          end;
      end;
  //вывод на экран
 
  Synchronize(UpdateStrinGrid) ;
     end;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2013, 15:09
Цитата Сообщение от maximjhon12 Посмотреть сообщение
изменил код третьего потока
Его вообще следует ликвидировать как 5-е колесо телеги, потому как ничего полезного кроме команд осн.потоку он не делает.
Все тоже самое с тем же успехом и с меньшими затратами выполнит основной поток.
0
1 / 1 / 0
Регистрация: 24.02.2013
Сообщений: 30
06.05.2013, 15:32  [ТС]
по условию задачи должно быть три потока
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2013, 15:41
Цитата Сообщение от maximjhon12 Посмотреть сообщение
по условию задачи должно быть три потока
основной + 2 дополнительных -= вот они тебе и три потока.
не сказано же что все три должны быть дополнительными)
0
1 / 1 / 0
Регистрация: 24.02.2013
Сообщений: 30
06.05.2013, 16:17  [ТС]
не понимаю что хочешь сказать mss. зачем мне убирать третий поток, если он в условии задачи. суть в том что заполняется только последняя строка таблицы (12-я), если изменить к-во строк например на 4 строки, заполнятся будет только 4-я строка, а мне нужно заполнить всю таблицу.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
06.05.2013, 16:27
Цитата Сообщение от maximjhon12 Посмотреть сообщение
третий поток, если он в условии задачи
Оригинального условия в дословной формулировке препода я не вижу, а то что ты привел в виде "условия" вполне может быть твоей отсебячиной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2013, 16:27
Помогаю со студенческими работами здесь

Заполнение StringGrid.
Привет=) Создаю мини-программу "Распространение свиного гриппа". На форме расположила StringGrid размером 11 х 11. По сути она очень...

Stringgrid заполнение
В общем проблема такая: я написала вручную заполнение стрингрида procedure TForm7.FormShow(Sender: TObject); begin ...

Заполнение StringGrid
Как заполнить рандомом StringGrid,если дано A:set of byte.???

заполнение stringgrid
имеется строка ,записанная в memo: 1-1-(1),1-2-(2),1-3-(2),2-1-(1)..и т.д., нужно заполнить stringgrid из этой строки, так чтоб первые два...

Stringgrid заполнение
После расширения до определенного размера, таблица не заполняется. Как это исправить?


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru