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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.05.2010, 23:32   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
у Delphi через eax передается указатель Self
ага, особенно при функции типа fastcall/register
ebx это Self.
eax,edx,ecx - это параметры.
а eax будет Sender тогда
Код:
<ebx>.OnCreate(Sender<eax>);
Цитата:
Виснет скорее всего из за того, что поток сделан через API ф-ю, а надо создавать Thread Object.
а Thread Object не с их помощью работает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 14.05.2010 в 23:35. Причина: добавил
Пепел Феникса вне форума Ответить с цитированием
Старый 15.05.2010, 11:56   #12
Виталий Серов
Заснувший
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 213
По умолчанию

В первом своём посте я намудрил не на шутку, оказалось что ошибка доступа вылазила из-за закрытия окна и бесконечности цикла потока, а зависание графика вызвано строкой:
Form1->PerformanceGraph1->Update();
Проблему можно решить отсылкой сообщения(я уже упоминал этот способ), ниже приведён полностью не зависающий график...

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "PERFGRAP"
#pragma resource "*.dfm"
TForm1 *Form1;
bool isrun;

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

DWORD CALLBACK Zap1(void*)
{
        while(1)
        {
        if (!isrun) ExitThread(0);
        Form1->PerformanceGraph1->DataPoint(clWhite,125);
        SendMessage(Form1->Handle,WM_PAINT,0,0);
        Sleep(10);
        }
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        isrun = true;
        CreateThread(NULL,0,Zap1,NULL,0, NULL);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        isrun = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Form1->PerformanceGraph1->Update();
}
//---------------------------------------------------------------------------
Само зависание происходило в результате попадания курсора в зону окна приложения или перекрытия другим окном... мистика...

Последний раз редактировалось Виталий Серов; 15.05.2010 в 12:00. Причина: о зависании рассказать забыл...
Виталий Серов вне форума Ответить с цитированием
Старый 17.05.2010, 05:52   #13
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Вот вот, программирование на грани мистики
И мистика на этом не заканчивается, теперь такой баг: работает программа, то есть рисует себе спокойно, но если окно сделать не активным, а потом снова активным, то на графике появляется нулевая точка и соответственно кривая вниз улетает. Ну я так понимаю это из за перерисовки окна, в которую был вставлен апгрейд графика, так как поток еще не поставил новую точку а график обновился с нулевой точкой. что делать. Да и как еще избавиться от начальной линии идущей до уровня текущего числа рисуемого на графике при запуске программы.
P.S. Вы так просто от меня не отделаетесь, я вам всем мозги изнасилую) шучу конечно.

Последний раз редактировалось Iong; 17.05.2010 в 06:41.
Iong вне форума Ответить с цитированием
Старый 17.05.2010, 07:26   #14
Виталий Серов
Заснувший
Форумчанин
 
Регистрация: 13.03.2009
Сообщений: 213
По умолчанию

Цитата:
работает программа, то есть рисует себе спокойно, но если окно сделать не активным, а потом снова активным, то на графике появляется нулевая точка и соответственно кривая вниз улетает. Ну я так понимаю это из за перерисовки окна, в которую был вставлен апгрейд графика, так как поток еще не поставил новую точку а график обновился с нулевой точкой. что делать.
Заменить сообщение WM_PAINT на WM_USER, только нужно сделать обработчик такого сообщения. Примерно так как тут.
Виталий Серов вне форума Ответить с цитированием
Старый 17.05.2010, 09:27   #15
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Ничего не понял, почитал тему по ссылке, но не понял. Объясните, пожалуйста, попроще.
Пример попробовал из темы, не компилируется, ругается на то что : [C++ Error] Unit1.h(31): E2303 Type name expected
В этой строке: bool __fastcall DataWaveIn(HWND hWnd, HWAVEIN hwav, LPWAVEHDR pHdr); эту строку закомментил, не ругается и программа работает.
Осталась одна проблема: Как сделать так что бы начального скачка не было видно на графике?
И еще вопросик: вот я изменяю интервал sleep();, но скорость обновления графика не изменяется, с этим ничего не поделать и все-таки есть выход?
Еще вопросик : если значения изменяются часто на графике, например такое значение как загрузка ЦП, то линии получаются какие то разрывные(в стандартном графике в диспетчере задач эти линии нормально рисуются), пробовал интервал сдвига графика при обновлении менять, не помогает, помогите.

Последний раз редактировалось Iong; 17.05.2010 в 11:15.
Iong вне форума Ответить с цитированием
Старый 19.05.2010, 05:21   #16
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Ни кто не знает или всем влом?
Iong вне форума Ответить с цитированием
Старый 19.05.2010, 08:51   #17
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Цитата:
если значения изменяются часто на графике, например такое значение как загрузка ЦП, то линии получаются какие то разрывные
Рисуйте не отдельными точками, а соединяйте их отрезками.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 19.05.2010, 12:22   #18
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Какими отрезками, так то этот элемент итак соединяет точки отрезками, но отрезки прерываются. Вот в этом и проблема.
Iong вне форума Ответить с цитированием
Старый 20.05.2010, 09:33   #19
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Помгите пожалуйста, Виталий, хоть кто ни будь. а то уже курсач сдавать надо.
Iong вне форума Ответить с цитированием
Старый 26.05.2010, 14:24   #20
Iong
Пользователь
 
Регистрация: 30.06.2009
Сообщений: 39
По умолчанию

Все. отбой. Можете не помогать, проблема не решена.
Iong вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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