Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 11:10   #1
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию Проблемы с PerformanceGraph в Borland C++

У меня возникла проблема, я делаю вот так:
Form1->PerformanceGraph1->DataPoint(clWhite,15);
Form1->PerformanceGraph1->Update();
Sleep(100);
Ну это все естественно в потоке либо просто в функции делаю, без разницы и так и так пробовал, короче проблема в том что после нескольких секунд(каждый раз разный промежуток времени) PerformanceGraph подвисает и висит-висит. Слееп пробовал по разному ставить. Помогите пожалуйста. Срочно надо.
Iong вне форума Ответить с цитированием
Старый 05.05.2010, 11:13   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

проблема в самой функции Sleep(), она сильно грузит систему, если действия происходят в цикле, тогда точно из-за нее
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 11:19   #3
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Да, и еще когда закрываешь программу, то выдает ошибку:
Project ....\имя проекта.exe faulted with message: 'access violation at 0x5060b7f4: read of address 0x000001f0'. Process Stopped. Use step or run to continue.
На всякий случай код программы всей:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hRead,th;
LONG ch;
DWORD razm=1;
DWORD dwBytesWritten = 0;

DWORD CALLBACK Zap1(void *q)
{
 while(TRUE)    
{
/*ReadFile(hRead,&ch,razm,&dwBytesWritten,NULL);
Form1->Memo1->Lines->Add(ch) ;
Form1->PerformanceGraph1->DataPoint(clWhite,ch);
Form1->PerformanceGraph1->Update();
Sleep(500);            */
Form1->PerformanceGraph1->DataPoint(clWhite,15);
Form1->PerformanceGraph1->Update();
Form1->PerformanceGraph1->Refresh();
Sleep(100);
}
}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseHandle(th);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
hRead=GetStdHandle(STD_INPUT_HANDLE);
th=CreateThread(NULL,0,Zap1,NULL,0,NULL);        
}
//---------------------------------------------------------------------------
хех. попробовал через компонент таймер. не виснет. и что теперь только так по нубски делать через таймер, это совсен не круто. может еще какой выход есть?

Последний раз редактировалось Stilet; 17.05.2010 в 08:36.
Iong вне форума Ответить с цитированием
Старый 05.05.2010, 11:27   #4
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

почему по нубски? таймер это новый поток, а Sleep тормозит текущий поток
NiCola999 вне форума Ответить с цитированием
Старый 05.05.2010, 11:48   #5
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Спасибо за помощь. А то я весь интернет перегуглил, и ничего не нашел.)

Блин. Как только программу какую то запускаю в системе, так моя программа подвисает сразу и висит.

Последний раз редактировалось Stilet; 17.05.2010 в 08:36.
Iong вне форума Ответить с цитированием
Старый 05.05.2010, 12:26   #6
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

WaitForSingleObject(NULL,time); вот еще одна функция задержки экрана, попробуй ее, хотя тормоза связанные с запуском других программ уже не от задержки экрана...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 12:35   #7
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Не помогает, паузы нет. вот текст программы:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hRead,th;
int ch;
DWORD razm=1;
DWORD dwBytesWritten = 0;

DWORD CALLBACK priem(void *q)
{
 while(TRUE)
{
ReadFile(hRead,&ch,razm,&dwBytesWritten,NULL);
Form1->Edit1->Text=ch;
Form1->PerformanceGraph1->DataPoint(clWhite,ch);
Form1->PerformanceGraph1->Update();
WaitForSingleObject(NULL,150);
}

}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
hRead=GetStdHandle(STD_INPUT_HANDLE);
th=CreateThread(NULL,0,priem,NULL,0,NULL);
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseHandle(th);        
}
//---------------------------------------------------------------------------
вообще без слипа она пролетает определенное количество циклов и виснет. Может там переполнение в этом performancegraph буфера какого ни будь.

Последний раз редактировалось Stilet; 17.05.2010 в 08:37.
Iong вне форума Ответить с цитированием
Старый 05.05.2010, 12:43   #8
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Скинь весь проект, не поленюсь сегодня вечером посмотрю...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 05.05.2010, 12:51   #9
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

ну это код второй программы которая читает из анономного канала данные. можно чтение просто в коммент поставить а строки можно так сделать, все равно висит:
Код:
Form1->PerformanceGraph1->DataPoint(clWhite,152);
Form1->PerformanceGraph1->Update();
короче стабильно не работает.

Помогите, что за глюки то с этим графиком.

Последний раз редактировалось Stilet; 17.05.2010 в 08:37.
Iong вне форума Ответить с цитированием
Старый 14.05.2010, 23:15   #10
Виталий Серов
Заснувший
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 213
По умолчанию

Попробовал откомпилировать ваш код, график действительно завис в отладчике вылезло Access Vialation, после беглого просмотра ассемблерного кода выяснилось, что через eax в функцию DataPoint должен был поступить некий не нулевой параметр, который потом используется для адресации памяти. Насколько я знаю у Delphi через eax передается указатель Self (или Sender или ещё как, короче это как то связано с объектом вызвавшим функцию). Значит в определенный момент времени (заранее не известный) указатель на PerformanceGraph1 становиться недоступным, вместо него передается нулевое значение и график зависает...
Отсюда вывод:
Виснет скорее всего из за того, что поток сделан через API ф-ю, а надо создавать Thread Object. Если хотите делать через API, то можно в потоке отсылать окну сообщения и в обработчике этих сообщений рисовать новые точки на графике...
А вообще самый рульный(простой) способ - таймер...

EDIT..........................
Виснет и в Thread Object, значит был не прав...

Последний раз редактировалось Виталий Серов; 15.05.2010 в 07:23. Причина: чтоб не мучится юзай таймер
Виталий Серов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу запустить ехешник ,Borland 5 и Borland 6 error_13 Общие вопросы C/C++ 0 31.01.2010 14:04
Проблемы с Borland C++ 3.1 Creeper Помощь студентам 0 25.04.2009 18:09
проблемы со связным списком с++ (Borland) adwaer Помощь студентам 0 15.04.2009 16:23
проблемы со связным списком с++ (Borland) adwaer Помощь студентам 0 15.04.2009 16:22