Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456

Зависает изображение на форме

16.12.2012, 19:21. Показов 3121. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Использую компонент image, программа работает в потоке, каждые 50 мс изображение меняется. Но через некоторое время изображение зависает. Почему так происходит?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2012, 19:21
Ответы с готовыми решениями:

Зависает изображение
здравствуйте Тип ЦП: QuadCore Intel Core i5-2500K, 3500 MHz (35 x 100) Системная плата: Asus P8Z68-V Pro/Gen3 Чипсет системной...

Зависает изображение
Здраствуйте. Помогите пожалуйста. Изображение на ноутбуке начало зависать, и при этом кулер начинает работать на полную мощность. Помогает...

Зависает изображение в играх
Система: Windows XP 2009 Unnatended Edition Service Pack 3 ASUSTek K8N-E AMD Sempron(tm) Processor 3000+ 1.81 Ггц. Оперативки 1.00...

33
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
16.12.2012, 19:36
кода нет, только мысли ?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.12.2012, 21:01
Потому что не используешь Synchronize() или SendMessage() для обращения к объектам основного потока. Может быть.
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 00:40  [ТС]
Работа с компонентом image
C++
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
void Radar::read_pos(unsigned char deg, unsigned char dis)
{
unsigned char x,y;
 
deg=180-deg;
if(deg < 5) deg = 5;
if(deg > 175) deg = 175;
if(dis < 10) dis = 10;
 
Form1->PaintBox1->Canvas->Pen->Color = clBlack;
Form1->PaintBox1->Canvas->Brush->Color = clBlack;
 
                           // Стираем точку под стрелкой...
if(points.enable[deg])
  {
   Form1->PaintBox1->Canvas->Rectangle(points.x[deg]-1,points.y[deg]-1,points.x[deg]+2,points.y[deg]+2);
   points.enable[deg]=false;
  }
 
if(deg < pre_pos.deg)                                                    //Стираем точку перед стрелкой
  {
   if(points.enable[deg-5])
     {
      Form1->PaintBox1->Canvas->Rectangle(points.x[deg-5]-1,points.y[deg-5]-1,points.x[deg-5]+2,points.y[deg-5]+2);
      points.enable[deg-5]=false;
     }
  }
 
if(deg > pre_pos.deg)
  {
   if(points.enable[deg+5])
     {
      Form1->PaintBox1->Canvas->Rectangle(points.x[deg+5]-1,points.y[deg+5]-1,points.x[deg+5]+2,points.y[deg+5]+2);
      points.enable[deg+5]=false;
     }
  }
 
 
Form1->PaintBox1->Canvas->MoveTo(pre_pos.x,pre_pos.y);     //Стираем предыдущую позицию стрелки
Form1->PaintBox1->Canvas->LineTo(80,80);
Form1->PaintBox1->Canvas->Pen->Color = RGB(80,236,120);
Form1->PaintBox1->Canvas->Brush->Color = RGB(80,236,120);
 
          //Рисуем стрелку
 
if(deg<90)
  {
   x = 80-mas_cos[deg/5];
   y = 80-mas_sin[deg/5];
   Form1->PaintBox1->Canvas->MoveTo(x,y);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
if(deg==90)
  {
   x = 80;
   y = 0;
   Form1->PaintBox1->Canvas->MoveTo(80,0);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
if(deg>90)
  {
   x = 80+mas_sin[(deg-90)/5];
   y = 80-mas_cos[(deg-90)/5];
   Form1->PaintBox1->Canvas->MoveTo(x,y);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
  if(dis<78)  //Ðèñóåì òî÷êè åñëè ÷òî òî åñòü
   {
    if(deg<90)     //âû÷åñëÿåì ïîëîæåíèå òî÷êè
      {
       points.x[deg] = 80-dis*cos(M_PI*deg/180);
       points.y[deg] = 80-dis*sin(M_PI*deg/180);
      }
 
    if(deg==90)
      {
       points.x[deg]=80;
       points.y[deg]=80-dis;
      }
 
    if(deg>90)
      {
       points.x[deg] = 80+dis*sin(M_PI*(deg-90)/180);
       points.y[deg] = 80-dis*cos(M_PI*(deg-90)/180);
      }
 
    Form1->PaintBox1->Canvas->Rectangle(points.x[pre_pos.deg]-1,points.y[pre_pos.deg]-1,points.x[pre_pos.deg]+2,points.y[pre_pos.deg]+2);
    points.enable[pre_pos.deg]=true;
   }
 
pre_pos.deg=deg;
pre_pos.x = x;
pre_pos.y = y;
}
Поток winapi
C++
1
2
3
4
5
6
7
8
9
myrobo=CreateThread(NULL, 0, MyroboThread, this, 0, NULL);
//---------------------------------------------------------------------------
DWORD WINAPI Robo::MyroboThread(LPVOID)
{
r->run();
if(crash)delete r;
return 0;
}
//---------------------------------------------------------------------------
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
18.12.2012, 00:47
А где тут в коде Image?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.12.2012, 07:11
И где загадочный r? Все опять должны угадывать, чего это за r->run() такое...
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
18.12.2012, 07:28
Цитата Сообщение от LK Посмотреть сообщение
Вот я всегда и говорю, что надо конкретно описывать желаемое, кто ж знал, что вам именно нужно, ведь угадыватель мыслей на растоянии у меня отключен за неуплату в этом месяце
Шо опять отключили?
2
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 09:29  [ТС]
Цитата Сообщение от gumi250 Посмотреть сообщение
А где тут в коде Image?
А да точно Paintbox)))))
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
18.12.2012, 09:37
Цитата Сообщение от Korbofos Посмотреть сообщение
Но через некоторое время изображение зависает. Почему так происходит?
а ф-ция отрисовки Paintboxа продолжает вызываться или нет?
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 09:46  [ТС]
Вот модули, простите за мою несобранность.
Вложения
Тип файла: rar R-term_oop.rar (106.8 Кб, 6 просмотров)
0
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 09:48  [ТС]
Да, продолжает
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.12.2012, 12:26
Из вторичного потока нельзя вот так запросто и напрямую обращаться к объектам классов из VCL. Возникает конфликт доступа и основной поток виснет или выкидывает access violation.

Удобнее всего в данном случае использовать класс TThread для организации потока. Наследуйся от TThread и все без исключения обращения к основному потоку пакуй в его внутренние методы, затем вызывай их через Synchronize().
C использованием потоков WinAPI, как у тебя сейчас, все малость сложнее - надо будет обращаться к основному потоку через PostMessage()/SendMessage() и обработчики сообщений.
2
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 15:11  [ТС]
BRcr, можете кинуть ссыль, где можно про это подробно почитать.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.12.2012, 15:41
Конечно - System.Classes.TThread.
Еще среди примеров в папке samples есть проект по потокам. На этой страничке можешь узнать, как найти эту папку - RTL.Threads Sample
А вот код того проекта, тут все в принципе похоже на твою задачу:
ThSort.h
C++
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
//---------------------------------------------------------------------------
#ifndef ThSortH
#define ThSortH
 
 
//---------------------------------------------------------------------------
#include <Windows.hpp>
#include <Messages.hpp>
#include <SysUtils.hpp>
#include <Variants.hpp>
#include <Classes.hpp>
#include <Graphics.hpp>
#include <Controls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
#include <StdCtrls.hpp>
#include <ExtCtrls.hpp>
#include "SortThds.h"
 
 
//---------------------------------------------------------------------------
 class TThreadSortForm: public TForm
{
__published:    // IDE-managed Components
    TPaintBox *BubbleSortBox;
    TPaintBox *SelectionSortBox;
    TPaintBox *QuickSortBox;
    TBevel *Bevel1;
    TBevel *Bevel2;
    TBevel *Bevel3;
    TButton *StartBtn;
    TLabel *Label1;
    TLabel *Label2;
    TLabel *Label3;
    void __fastcall StartBtnClick(TObject *Sender);
    void __fastcall BubbleSortBoxPaint(TObject *Sender);
    void __fastcall SelectionSortBoxPaint(TObject *Sender);
    void __fastcall QuickSortBoxPaint(TObject *Sender);
    void __fastcall FormCreate(TObject *Sender);
private: // User declarations
    int ThreadsRunning;
    void __fastcall RandomizeArrays();
    void __fastcall ThreadDone(TObject *Sender);
public:  // User declarations
    void __fastcall PaintArray(TPaintBox *Box, TSortArray &A);
    __fastcall TThreadSortForm(TComponent *AOwner);
};
 
//---------------------------------------------------------------------------
extern PACKAGE   TThreadSortForm *ThreadSortForm;
//---------------------------------------------------------------------------
 
#endif
ThSort.cpp
C++
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
//---------------------------------------------------------------------------
// Copyright (c) 1995-2010 Embarcadero Technologies, Inc.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "ThSort.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
TThreadSortForm *ThreadSortForm;
 
 
bool ArraysRandom;
TSortArray BubbleSortArray;
TSortArray SelectionSortArray;
TSortArray QuickSortArray;
 
/* TThreadSortForm */
//---------------------------------------------------------------------------
 
__fastcall TThreadSortForm::TThreadSortForm(TComponent *AOwner)
 
        :TForm(AOwner)
 
{
 
}
 
 
//---------------------------------------------------------------------------
 
void __fastcall TThreadSortForm::PaintArray(TPaintBox *Box, TSortArray &A)
{
  Box->Canvas->Pen->Color = clRed;
  for(int i = 0; i < ASize(A) - 1; ++i)
        PaintLine(Box->Canvas, i, A[i]);
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::BubbleSortBoxPaint(TObject *)
{
  PaintArray(BubbleSortBox, BubbleSortArray);
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::SelectionSortBoxPaint(TObject *)
{
  PaintArray(SelectionSortBox, SelectionSortArray);
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::QuickSortBoxPaint(TObject *)
{
  PaintArray(QuickSortBox, QuickSortArray);
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::FormCreate(TObject *)
{
  RandomizeArrays();
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::StartBtnClick(TObject *)
{
  RandomizeArrays();
  ThreadsRunning = 3;
  TBubbleSort *BubbleSort = new TBubbleSort(BubbleSortBox, BubbleSortArray);
  BubbleSort->OnTerminate = ThreadDone;
  TSelectionSort *SelectionSort = new TSelectionSort(SelectionSortBox, SelectionSortArray);
  SelectionSort->OnTerminate = ThreadDone;
  TQuickSort *QuickSort = new TQuickSort(QuickSortBox, QuickSortArray);
  QuickSort->OnTerminate = ThreadDone;
  StartBtn->Enabled = false;
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::RandomizeArrays()
{
  if( ! ArraysRandom ) {
    Randomize();
    for(int i = 0; i < ASize(BubbleSortArray); ++i) {
        BubbleSortArray[i] = Random(ARRAY_SIZE - 1);
        SelectionSortArray[i] = BubbleSortArray[i];
        QuickSortArray[i] = BubbleSortArray[i];
    }
    ArraysRandom = true;
    Repaint();
  }
}
 
//---------------------------------------------------------------------------
void __fastcall TThreadSortForm::ThreadDone(TObject *)
{
  ThreadsRunning--;
  if( ThreadsRunning == 0 ) {
 
    StartBtn->Enabled = true;
    ArraysRandom = false;
  }
}
SortThds.h
C++
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
//---------------------------------------------------------------------------
#ifndef SortThdsH
#define SortThdsH
 
 
//---------------------------------------------------------------------------
 
#include <Classes.hpp>
#include <Graphics.hpp>
#include <ExtCtrls.hpp>
 
#define ARRAY_SIZE 512
typedef int TSortArray[ARRAY_SIZE];
 
//---------------------------------------------------------------------------
 
 class TSortThread: public TThread
{
__published:    // IDE-managed Components
private: // User declarations
    TPaintBox *FBox;
    TSortArray FSortArray;
    int FSize;
    int FA; int FB; int FI; int FJ;
    void __fastcall DoVisualSwap();
protected:  // User declarations
    void __fastcall Execute();
    void __fastcall VisualSwap(int A, int B, int I, int J);
    virtual void __fastcall Sort(TSortArray &A);
public:  // User declarations
    __fastcall TSortThread(TPaintBox *Box, TSortArray &SortArray);
};
//---------------------------------------------------------------------------
 
 
/* TBubbleSort */
//---------------------------------------------------------------------------
 
 class TBubbleSort: public TSortThread
{
__published:    // IDE-managed Components
protected:  // User declarations
    void __fastcall Sort( TSortArray &A);
public:
    __fastcall TBubbleSort(TPaintBox *Box,  TSortArray &SortArray);
};
//---------------------------------------------------------------------------
 
 
/* TSelectionSort */
//---------------------------------------------------------------------------
 
 class TSelectionSort: public TSortThread
{
__published:    // IDE-managed Components
protected:  // User declarations
    void __fastcall Sort( TSortArray &A);
public:
    __fastcall TSelectionSort(TPaintBox *Box,  TSortArray &SortArray);
};
//---------------------------------------------------------------------------
 
 
/* TQuickSort */
//---------------------------------------------------------------------------
 
 class TQuickSort: public TSortThread
{
__published:    // IDE-managed Components
protected:  // User declarations
    void __fastcall Sort( TSortArray &A);
    void __fastcall QuickSort(TSortArray &A, int iLo, int iHi);
public:
    __fastcall TQuickSort(TPaintBox *Box,  TSortArray &SortArray);
};
//---------------------------------------------------------------------------
 
 
extern PACKAGE void __fastcall PaintLine(TCanvas *Canvas, int I, int Len);
extern PACKAGE int ASize(TSortArray &A);
 
#endif
SortThds.cpp
C++
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "SortThds.h"
 
//---------------------------------------------------------------------------
void __fastcall PaintLine(TCanvas *Canvas, int i, int len)
{
  Canvas->MoveTo(1, int(i/2.22)+1);
  Canvas->LineTo(int(len/2.92)+1, int(i/2.22)+1);
}
 
 
//---------------------------------------------------------------------------
 
int ASize(TSortArray &A)
 
{
 
  return sizeof(A)/sizeof(int);
 
}
 
 
/* TSortThread */
 
//---------------------------------------------------------------------------
 
void __fastcall TSortThread::Sort(TSortArray &)
 
{
 
}
 
 
//---------------------------------------------------------------------------
 
__fastcall TSortThread::TSortThread(TPaintBox *Box, TSortArray &SortArray)
        : TThread(false)
{
  FBox = Box;
  FSize = ASize(SortArray);
  for(int i=0; i<FSize; ++i) {
      FSortArray[i] = SortArray[i];
  }
  FreeOnTerminate = true;
}
 
/* Since DoVisualSwap uses a VCL component (i.e., the TPaintBox) it should never
  be called directly by this thread.  DoVisualSwap should be called by passing
  it to the Synchronize method which causes DoVisualSwap to be executed by the
  main VCL thread, avoiding multi-thread conflicts. See VisualSwap for an
  example of calling Synchronize. */
//---------------------------------------------------------------------------
 
void __fastcall TSortThread::DoVisualSwap()
{
  FBox->Canvas->Pen->Color = clBtnFace;
  PaintLine(FBox->Canvas, FI, FA);
  PaintLine(FBox->Canvas, FJ, FB);
  FBox->Canvas->Pen->Color = clRed;
  PaintLine(FBox->Canvas, FI, FB);
  PaintLine(FBox->Canvas, FJ, FA);
}
 
/* VisusalSwap is a wrapper on DoVisualSwap making it easier to use.  The
  parameters are copied to instance variables so they are accessable
  by the main VCL thread when it executes DoVisualSwap */
//---------------------------------------------------------------------------
 
void __fastcall TSortThread::VisualSwap(int a, int b, int i, int j)
{
  FA = a;
  FB = b;
  FI = i;
  FJ = j;
  Synchronize(DoVisualSwap);
}
 
/* The Execute method is called when the thread starts */
//---------------------------------------------------------------------------
 
void __fastcall TSortThread::Execute()
{
  TThread::NameThreadForDebugging((AnsiString)ClassName());
  Sort(&FSortArray);
}
 
/* TBubbleSort */
//---------------------------------------------------------------------------
 
__fastcall TBubbleSort::TBubbleSort(TPaintBox *Box, TSortArray &SortArray)
 
        :TSortThread(Box,SortArray)
 
{
 
}
 
 
//---------------------------------------------------------------------------
 
void __fastcall TBubbleSort::Sort(TSortArray &A)
{
  for(int i = ASize(A)-1; i > 0; --i)
    for(int j = 0; j < ASize(A) - 1; ++j)
      if( A[j] > A[j + 1] )
 
      {
        VisualSwap(A[j], A[j + 1], j, j + 1);
        int t = A[j];
        A[j] = A[j + 1];
        A[j + 1] = t;
        if( Terminated ) return;
      }
}
 
/* TSelectionSort */
//---------------------------------------------------------------------------
 
__fastcall TSelectionSort::TSelectionSort(TPaintBox *Box, TSortArray &SortArray)
 
        :TSortThread(Box,SortArray)
 
{
 
}
 
 
//---------------------------------------------------------------------------
 
void __fastcall TSelectionSort::Sort(TSortArray &A)
{
  for(int i = 0; i < ASize(A) - 2; i++)
    for(int j = ASize(A)-1; j > i + 1; j--)
      if( A[i] > A[j] )
 
      {
        VisualSwap(A[i], A[j], i, j);
        int t = A[i];
        A[i] = A[j];
        A[j] = t;
        if( Terminated ) return;
      }
}
 
/* TQuickSort */
//---------------------------------------------------------------------------
 
__fastcall TQuickSort::TQuickSort(TPaintBox *Box, TSortArray &SortArray)
 
        :TSortThread(Box,SortArray)
 
{
 
}
 
 
//---------------------------------------------------------------------------
 
  void __fastcall TQuickSort::QuickSort(TSortArray &A, int iLo, int iHi)
{
    int Lo = iLo;
    int Hi = iHi;
    int Mid = A[(Lo + Hi) / 2];
    do {
 
      while( A[Lo] < Mid ) Lo++;
      while( A[Hi] > Mid ) Hi--;
      if( Lo <= Hi )
 
      {
        VisualSwap(A[Lo], A[Hi], Lo, Hi);
        int t = A[Lo];
        A[Lo] = A[Hi];
        A[Hi] = t;
        Lo++;
        Hi--;
      }
    } while(Lo <= Hi);
    if( Hi > iLo ) QuickSort(A, iLo, Hi);
    if( Lo < iHi ) QuickSort(A, Lo, iHi);
    if( Terminated ) return;
  }
 
//---------------------------------------------------------------------------
void __fastcall TQuickSort::Sort(TSortArray &A)
{
 
  QuickSort(A, 0, ASize(A)-1);
 
}
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 16:28  [ТС]
И ещё не понял до конца, что это за основной поток? В котором выполняется сама форма???
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
18.12.2012, 16:35
Да, но и не только. Погуглить не пробовал?
Многозадачность в Windows
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
18.12.2012, 20:16  [ТС]
Спс, отправился за новыми знаниями

Добавлено через 3 часа 10 минут
BRcr, только вот теперь не представляю как это сделать
Класс Robo работает в потоке. Он вызывает класс Radar, который рисует на форме, но при этом и сам класс Robo иногда кидает мессаги на форму. Это теперь совместить всё между собой???
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
18.12.2012, 23:22
Ф-ция которая в потоке пишет (рисует), что-нибудь на форме должна быть вызвана через Synchronize. Т.е. Все рисования на форме выносятся в отдельные ф-ции и вызываются через Synchronizeю
1
11 / 11 / 2
Регистрация: 15.08.2011
Сообщений: 456
31.12.2012, 17:45  [ТС]
Хм, начал использовать Synchronize программа вылетает практически сразу.

Добавлено через 1 минуту
Вот эта функция
C++
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
void __fastcall Robo::Read_pos()
{
unsigned char x,y;
deg=180-deg;
if(deg < 5) deg = 5;
if(deg > 175) deg = 175;
if(dis < 10) dis = 10;
 
Form1->PaintBox1->Canvas->Pen->Color = clBlack;
Form1->PaintBox1->Canvas->Brush->Color = clBlack;
 
                           // Ñòèðàåì òî÷êó ïîä ñòðåëêîé...
if(points.enable[deg])
  {
   Form1->PaintBox1->Canvas->Rectangle(points.x[deg]-1,points.y[deg]-1,points.x[deg]+2,points.y[deg]+2);
   points.enable[deg]=false;
  }
 
if(deg < pre_pos.deg)                                                    //Ñòèðàåì òî÷êè ïåðåä ñòðåëêîé
  {
   if(points.enable[deg-5])
     {
      Form1->PaintBox1->Canvas->Rectangle(points.x[deg-5]-1,points.y[deg-5]-1,points.x[deg-5]+2,points.y[deg-5]+2);
      points.enable[deg-5]=false;
     }
  }
 
if(deg > pre_pos.deg)
  {
   if(points.enable[deg+5])
     {
      Form1->PaintBox1->Canvas->Rectangle(points.x[deg+5]-1,points.y[deg+5]-1,points.x[deg+5]+2,points.y[deg+5]+2);
      points.enable[deg+5]=false;
     }
  }
 
 
Form1->PaintBox1->Canvas->MoveTo(pre_pos.x,pre_pos.y);     //ñòèðàåì ñòàðóþ ïîçèöèþ ñòðåëêè
Form1->PaintBox1->Canvas->LineTo(80,80);
Form1->PaintBox1->Canvas->Pen->Color = RGB(80,236,120);
Form1->PaintBox1->Canvas->Brush->Color = RGB(80,236,120);
 
          //Ðèñóåì íîâóþ ïîçèöèþ ñòðåëêè
 
if(deg<90)
  {
   x = 80-mas_cos[deg/5];
   y = 80-mas_sin[deg/5];
   Form1->PaintBox1->Canvas->MoveTo(x,y);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
if(deg==90)
  {
   x = 80;
   y = 0;
   Form1->PaintBox1->Canvas->MoveTo(80,0);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
if(deg>90)
  {
   x = 80+mas_sin[(deg-90)/5];
   y = 80-mas_cos[(deg-90)/5];
   Form1->PaintBox1->Canvas->MoveTo(x,y);
   Form1->PaintBox1->Canvas->LineTo(80,80);
  }
 
if(dis<78)
  {
    if(deg<90)     //âû÷åñëÿåì ïîëîæåíèå òî÷êè
      {
       points.x[deg] = 80-dis*cos(M_PI*deg/180);
       points.y[deg] = 80-dis*sin(M_PI*deg/180);
      }
 
    if(deg==90)
      {
       points.x[deg]=80;
       points.y[deg]=80-dis;
      }
 
    if(deg>90)
      {
       points.x[deg] = 80+dis*sin(M_PI*(deg-90)/180);
       points.y[deg] = 80-dis*cos(M_PI*(deg-90)/180);
      }
  }
 
if(pre_pos.dis<78) //Ðèñóåì òî÷êè åñëè ÷òî òî åñòü
  {
   Form1->PaintBox1->Canvas->Rectangle(points.x[pre_pos.deg]-1,points.y[pre_pos.deg]-1,points.x[pre_pos.deg]+2,points.y[pre_pos.deg]+2);
   points.enable[pre_pos.deg]=true;
  }
 
pre_pos.dis=dis;
pre_pos.deg=deg;
pre_pos.x = x;
pre_pos.y = y;
}
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.12.2012, 18:00
Вычисления должны быть в самом потоке,а рисование через Syncronize()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2012, 18:00
Помогаю со студенческими работами здесь

Зависает изображение на мониторе
Во время игры стало зависать изображение. То есть раздаётся системный звук, после чего изображение зависает. Всё остальное продолжает...

Зависает изображение в игре
Всем добрый день. Люди добрые помогите, уже всё перепробовал. Обновлял все драйвера, биос и тд. У меня вроде хороший компьютер не должно...

Зависает изображение в KMPlayer
Добрый вечер. При просмотри сериала,изображение в видио останавливается(зависает)а звук играет дальше. Решается перемоткой видио но это...

Зависает изображение в играх
Короче говоря,играю в игрушки(типо Доты КС и т.д.), и когда захожу либо в игру,либо в матч,зависает намертво картинка,но игра идёт дальше...

Зависает изображение в играх
Видяха AMD R9 x280 в некоторых играх просто намертво зависает изображение: Call of Juarez Gunslinger почти в самом начале игре после...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 01.04.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru