Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > VC проблема :(


Автор: Alexej8 5.5.2008, 11:58
Здравствуйте всем.

Я в VC решаю системы уравнений. Кое-как это вышло. Но сейчас нужно ко всему этот процесс визуализировать (то есть пошагово отображать результаты). А моих мощностей, к сожалению, на данном этапе не хватает. К тому же времени до защиты осталось чуть больше недели. Я в программировании слабоват совсем пока, поэтому решил обратиться к гуру, может, кто подскажет из специалистов.
Дело в чем: у меня есть главная процедура в ней нужно сделать остановки и продолжать толи по нажатию кнопки, толи просто по таймеру,но начально эо не предуматривалось и теперь не знаю возможно так сделать при такой структуре
  
Код

void CZGaussDlg::ZGauss(double *pA, double *pB, double *pX, int n)   
{     
    for(int j=0;j<(n-1);j++)  
    {  
        int m=MaxElem(pA,j,n);  
// 1 Первая остановка  
        ChangeRow(pA,pB,j,m,n);  
// 2 Вторая остановка  
        ExchangeData(pM,pF,n);  
        for (int i=j+1;i<n;i++)  
        {  
            SumRow(pA,pB,j,i,n);  
// 3 Третья осановка  
            ExchangeData(pM,pF,n);  
        }   
    }   
    //обратный ход   
    UpdateData(FALSE);   
    for (int i=(n-1);i>=0;i--)   
    {                                 
        double s=pB[i];               
 
        double *p=pA+i*(n+1)+1;       
 
        for (j=i+1;j<n;j++,p++)  
        {  
            s-=*p*pX[j];              
          
        }   
        pX[i]=s/ *(pA+i*(n+1));        
    }   
// 4 Четвертая остановка   
    ExchangeData(pM,pF,n);   
    //перед неизв   
    for (i=0; i<n; i++)   
        for (int j=0; j<(n*n); j+=n)   
            SetDlgItemInt(30000+i+j,pX[i]);   
    m_calc_on_step.EnableWindow(FALSE);   
    UpdateData(FALSE);   
}   

1,2,3,4: вот в этих местах мне нужно делать паузу,чтоб пользователь видел что происходит с матрицей. Ребят, подскажите возможно это сделать при такой структуре или мои дела совсем плохи? smile 
Работаю в Microsoft Visual Studio 6.0

Автор: Lazin 5.5.2008, 12:15
Разбить на 4-ре функции smile 

Автор: Alexej8 5.5.2008, 12:57
ведь у меня первых 3 остановки должно быть внутри цикла. как же его разорвать на ф-ции? smile  
все, ушел вешаться :(

Автор: dizzy1984 6.5.2008, 12:25
Можно подождать фиксированный момент времени с помощью Sleep.
С кнопками тоже можно; единственное что пока пришло в голову - выполнять вычисления в отдельном потоке и останавливать его по глобальному флагу, который включается в обработчике нажатия кнопки. Собственно, самой большой проблемой тут я вижу визуализацию - как ты это будешь показывать?

Автор: ama_kid 6.5.2008, 12:47
Alexej8, из того, что я увидел, мне ясно следующее: остановки можно сделать в двух местах - в начале функции ChangeRow и в начале функции ExchangeData. А уж как эти остановки реализовать - зависит от того, как ты собрался визуализировать "процесс"..

Автор: Alexej8 6.5.2008, 18:15
Спасиб, что не оставили без внимания пост. smile 
Sleep, думаю, не совсем то.  А вот потоки это уже интересней. Мне вот вчера тоже подсказали, что можно прерывать основной поток с помощью SuspendThread/ResumeThread. Вот только проблема: я с ними никогда не сталкивался и не знаю как с ними работать.. Может у кого есть простые примерчики с потоками или ссылки знаете, где это хорошо описано.. буду очень признателен. очень нужно.   smile smile 
А визуализация будет происходит так: после каждого действия значения элементов матрицы будут обновляться в едитах. Ну и если повезет, разберусь с работой РичЕдита, в котором будет описание каждого действия.

Автор: dizzy1984 7.5.2008, 10:37
немного переделал
VS6.0

Хидер
Код

struct params
{
double *pA;
double *pB;
double *pX;
int n;
};

class CZGaussDlg : public CDialog
{
//...
unsigned int m_threadHandle;
params m_params;
static unsigned int __stdcall ZGauss(void *p);
//...
}


Файл реализации
Код

//...
#include <process.h>
//...
<функция вызывающая CZGaussDlg::ZGauss>
{
unsigned int dummy;
// Инициализация параметров
m_params.n = ..;
m_params.pA = ..;
m_params.pB = .. ;
m_params.pX = ..;
    
m_threadHandle = _beginthreadex(NULL, 0, ZGauss, &m_params, 0, &dummy);
//...
}

void CZGaussDlg::OnOK() 
{
// К примеру ок играет роль кнопки "далее"
ResumeThread(reinterpret_cast<HANDLE>(m_threadHandle));
//CDialog::OnOK();
}

// Вариант с SuspendThread
unsigned int CZGaussDlg::ZGauss(void *p)
{      
    double *pA = reinterpret_cast<params*>(p)->pA;
    double *pB = reinterpret_cast<params*>(p)->pB;
    double *pX = reinterpret_cast<params*>(p)->pX;
    int n      = reinterpret_cast<params*>(p)->n;

    for(int j=0;j<(n-1);j++)    
    {    
        int m=MaxElem(pA,j,n);    
        // Вывод результатов
        SuspendThread(GetCurrentThread());
        ChangeRow(pA,pB,j,m,n);    
        // Вывод результатов
        SuspendThread(GetCurrentThread());
        ExchangeData(pM,pF,n);    
        for (int i=j+1;i<n;i++)    
        {    
            SumRow(pA,pB,j,i,n);    
            // Вывод результатов
            SuspendThread(GetCurrentThread());
            ExchangeData(pM,pF,n);    
        }    
    }    
    //обратный ход    
    UpdateData(FALSE);    
    for (int i=(n-1);i>=0;i--)    
    {                                  
        double s=pB[i];                
    
        double *p=pA+i*(n+1)+1;        
    
        for (j=i+1;j<n;j++,p++)    
        {    
            s-=*p*pX[j];               
           
        }    
        pX[i]=s/ *(pA+i*(n+1));         
    }    
    // Вывод результатов
    SuspendThread(GetCurrentThread());
    ExchangeData(pM,pF,n);    
    //перед неизв    
    for (i=0; i<n; i++)    
        for (int j=0; j<(n*n); j+=n)    
            SetDlgItemInt(30000+i+j,pX[i]);    
    m_calc_on_step.EnableWindow(FALSE);    
    UpdateData(FALSE);    
} 

// Вариант с Sleep
unsigned int CZGaussDlg::ZGauss(void *p)    
{      
    double *pA = reinterpret_cast<params*>(p)->pA;
    double *pB = reinterpret_cast<params*>(p)->pB;
    double *pX = reinterpret_cast<params*>(p)->pX;
    int n      = reinterpret_cast<params*>(p)->n;

    for(int j=0;j<(n-1);j++)    
    {    
        int m=MaxElem(pA,j,n);    
        // Вывод результатов
        Sleep(3000);
        ChangeRow(pA,pB,j,m,n);    
        // Вывод результатов
        Sleep(3000);
        ExchangeData(pM,pF,n);    
        for (int i=j+1;i<n;i++)    
        {    
            SumRow(pA,pB,j,i,n);    
            // Вывод результатов
            Sleep(3000);
            ExchangeData(pM,pF,n);    
        }    
    }    
    //обратный ход    
    UpdateData(FALSE);    
    for (int i=(n-1);i>=0;i--)    
    {                                  
        double s=pB[i];                
    
        double *p=pA+i*(n+1)+1;        
    
        for (j=i+1;j<n;j++,p++)    
        {    
            s-=*p*pX[j];               
           
        }    
        pX[i]=s/ *(pA+i*(n+1));         
    }    
    // Вывод результатов
    Sleep(3000);
    ExchangeData(pM,pF,n);    
    //перед неизв    
    for (i=0; i<n; i++)    
        for (int j=0; j<(n*n); j+=n)    
            SetDlgItemInt(30000+i+j,pX[i]);    
    m_calc_on_step.EnableWindow(FALSE);    
    UpdateData(FALSE);    
} 

Некрасивый момент заключается в том, что поток не закрывается перед закрытием программы (например, если мы нажали на cancel), но, по идее, ОС это сама сделает, так что проблемы тут не должно быть.

Автор: Alexej8 7.5.2008, 14:10
dizzy, Спасибо Вам огромное. smile  Пойду пробовать. Надеюсь, что все правильно вставлю и все заработает smile 

Автор: VFaraon 17.5.2008, 23:41
Здравствуйте!
Решил я научиться работать с MySQL. Но до этого работал только в Builder, а сейчас решил основательно осваивать Visual C++. Ближе к делу: когда пытаюсь скомпилировать проект с включенными хидерами пишет следуюющее:

Цитата


------ Build started: Project: test, Configuration: Debug Win32 ------
Compiling...
test.cpp
Linking...
test.obj : error LNK2028: unresolved token (0A00015F) "public: __thiscall mysqlpp::mysql_type_info::mysql_type_info(class mysqlpp::mysql_type_info const &)" (??0mysql_type_info@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "public: __thiscall mysqlpp::Field::Field(class mysqlpp::Field const &)" (??0Field@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2028: unresolved token (0A0001B3) "public: __thiscall mysqlpp::String::String(class mysqlpp::String const &)" (??0String@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "void __cdecl std::_Construct<class mysqlpp::String,class mysqlpp::String>(class mysqlpp::String *,class mysqlpp::String const &)" (??$_Construct@VString@mysqlpp@@V12@@std@@$$FYAXPAVString@mysqlpp@@ABV12@@Z)
test.obj : error LNK2028: unresolved token (0A0001B4) "public: __thiscall mysqlpp::String::~String(void)" (??1String@mysqlpp@@$$FQAE@XZ) referenced in function "public: void * __thiscall mysqlpp::String::`scalar deleting destructor'(unsigned int)" (??_GString@mysqlpp@@$$FQAEPAXI@Z)
test.obj : error LNK2028: unresolved token (0A0001B7) "public: class mysqlpp::String & __thiscall mysqlpp::String::operator=(class mysqlpp::String const &)" (??4String@mysqlpp@@$$FQAEAAV01@ABV01@@Z) referenced in function "class mysqlpp::String * __cdecl std::_Copy_backward_opt<class mysqlpp::String *,class mysqlpp::String *,struct std::forward_iterator_tag>(class mysqlpp::String *,class mysqlpp::String *,class mysqlpp::String *,struct std::forward_iterator_tag,struct std::_Nonscalar_ptr_iterator_tag,struct std::_Range_checked_iterator_tag)" (??$_Copy_backward_opt@PAVString@mysqlpp@@PAV12@Uforward_iterator_tag@std@@@std@@$$FYAPAVString@mysqlpp@@PAV12@00Uforward_iterator_tag@0@U_Nonscalar_ptr_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z)
test.obj : error LNK2028: unresolved token (0A000659) "extern "C" void __stdcall mysql_free_result(struct st_mysql_res *)" (?mysql_free_result@@$$J14YGXPAUst_mysql_res@@@Z) referenced in function "public: void __thiscall mysqlpp::RefCountedPointerDestroyer<struct st_mysql_res>::operator()(struct st_mysql_res *)const " (??R?$RefCountedPointerDestroyer@Ust_mysql_res@@@mysqlpp@@$$FQBEXPAUst_mysql_res@@@Z)
test.obj : error LNK2028: unresolved token (0A000730) "public: __thiscall mysqlpp::Connection::Connection(class mysqlpp::Connection const &)" (??0Connection@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "public: __thiscall mysqlpp::UnixDomainSocketConnection::UnixDomainSocketConnection(class mysqlpp::UnixDomainSocketConnection const &)" (??0UnixDomainSocketConnection@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2028: unresolved token (0A000733) "public: virtual __thiscall mysqlpp::Connection::~Connection(void)" (??1Connection@mysqlpp@@$$FUAE@XZ) referenced in function "public: __thiscall mysqlpp::UnixDomainSocketConnection::UnixDomainSocketConnection(class mysqlpp::UnixDomainSocketConnection const &)" (??0UnixDomainSocketConnection@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall mysqlpp::Connection::~Connection(void)" (??1Connection@mysqlpp@@$$FUAE@XZ) referenced in function "public: __thiscall mysqlpp::UnixDomainSocketConnection::UnixDomainSocketConnection(class mysqlpp::UnixDomainSocketConnection const &)" (??0UnixDomainSocketConnection@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2019: unresolved external symbol "public: __thiscall mysqlpp::Connection::Connection(class mysqlpp::Connection const &)" (??0Connection@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "public: __thiscall mysqlpp::UnixDomainSocketConnection::UnixDomainSocketConnection(class mysqlpp::UnixDomainSocketConnection const &)" (??0UnixDomainSocketConnection@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall mysqlpp::Connection::connect(char const *,char const *,char const *,char const *,unsigned int)" (?connect@Connection@mysqlpp@@UAE_NPBD000I@Z)
test.obj : error LNK2019: unresolved external symbol "public: __thiscall mysqlpp::mysql_type_info::mysql_type_info(class mysqlpp::mysql_type_info const &)" (??0mysql_type_info@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "public: __thiscall mysqlpp::Field::Field(class mysqlpp::Field const &)" (??0Field@mysqlpp@@$$FQAE@ABV01@@Z)
test.obj : error LNK2019: unresolved external symbol "extern "C" void __stdcall mysql_free_result(struct st_mysql_res *)" (?mysql_free_result@@$$J14YGXPAUst_mysql_res@@@Z) referenced in function "public: void __thiscall mysqlpp::RefCountedPointerDestroyer<struct st_mysql_res>::operator()(struct st_mysql_res *)const " (??R?$RefCountedPointerDestroyer@Ust_mysql_res@@@mysqlpp@@$$FQBEXPAUst_mysql_res@@@Z)
test.obj : error LNK2019: unresolved external symbol "public: __thiscall mysqlpp::String::~String(void)" (??1String@mysqlpp@@$$FQAE@XZ) referenced in function "public: void * __thiscall mysqlpp::String::`scalar deleting destructor'(unsigned int)" (??_GString@mysqlpp@@$$FQAEPAXI@Z)
test.obj : error LNK2019: unresolved external symbol "public: __thiscall mysqlpp::String::String(class mysqlpp::String const &)" (??0String@mysqlpp@@$$FQAE@ABV01@@Z) referenced in function "void __cdecl std::_Construct<class mysqlpp::String,class mysqlpp::String>(class mysqlpp::String *,class mysqlpp::String const &)" (??$_Construct@VString@mysqlpp@@V12@@std@@$$FYAXPAVString@mysqlpp@@ABV12@@Z)
test.obj : error LNK2019: unresolved external symbol "public: class mysqlpp::String & __thiscall mysqlpp::String::operator=(class mysqlpp::String const &)" (??4String@mysqlpp@@$$FQAEAAV01@ABV01@@Z) referenced in function "class mysqlpp::String * __cdecl std::_Copy_backward_opt<class mysqlpp::String *,class mysqlpp::String *,struct std::forward_iterator_tag>(class mysqlpp::String *,class mysqlpp::String *,class mysqlpp::String *,struct std::forward_iterator_tag,struct std::_Nonscalar_ptr_iterator_tag,struct std::_Range_checked_iterator_tag)" (??$_Copy_backward_opt@PAVString@mysqlpp@@PAV12@Uforward_iterator_tag@std@@@std@@$$FYAPAVString@mysqlpp@@PAV12@00Uforward_iterator_tag@0@U_Nonscalar_ptr_iterator_tag@0@U_Range_checked_iterator_tag@0@@Z)
C:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\test\Debug\test.exe : fatal error LNK1120: 15 unresolved externals
Build log was saved at "file://c:\Documents and Settings\Admin\Мои документы\Visual Studio 2005\Projects\test\test\Debug\BuildLog.htm"
test - 16 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========




И так с каждым (включал поодельности) файлом.
Как это решить?

Автор: dizzy1984 19.5.2008, 06:12
VFaraon, создавай новый топик в соответствующем разделе и я помогу разобраться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)