使用wxThread在wxListCtrl中填充数据库表 - 我可以填写,但系统将挂起

时间:2011-02-17 12:38:58

标签: c++ wxwidgets

首先我制作了一个用于在wxListCtrl中显示表格的程序,它可以工作但是数据量有限。 它显示了一个问题: - 当我执行程序。框架在一段时间后可见......但它确实有效  然后我转向使用wxThread现在everthing正常,现在当我执行程序帧立即可见因为我写Sleep(1000),所以它在wxListCtrl中逐一添加一行,但它给出了意想不到的结果取决于多少行在数据库中.. 我的代码是: -

# include "thread.h"
# include "login.h"
# include "sql.h"
# include <mysql.h>

class List_Ctrl_Data;

MyThread :: MyThread(login* login_obj)
{
     this->temp = login_obj;
}
void *MyThread :: Entry()
{
    int i=1,j,k=0   ;
    while(i!=100)
    {
            long index=this->temp->data_list_control->InsertItem(i,wxT("amit"));
            for(j=1;j<3;j++)
            {
               this->temp->data_list_control->SetItem(index,j,wxT("pathak"));
            }
            k++;
            if(k==1)
            {
                            k=10;
                       this->Sleep(1000);
            }
            i++;                                                
    }
}

这里data_list_control是wxListCtrl的对象,借助于线程i填充wxListCtrl中的值。 有人建议我在这里你一次又一次地从线程入口敲击帧控制(wxListCtrl), 这就是为什么框架被绞死你应该使用wxPost或AddPendingRequest,我不认为它会工作, 我试图向你解释我的疑问,你仍然觉得有什么问题,欢迎你...如果你能帮助我,那对我来说会很多

2 个答案:

答案 0 :(得分:1)

您看到的问题可能是由于您从辅助线程而不是主线程调用GUI控件上的方法。这应该从不完成。您需要添加主线程中的项目。

我猜测你尝试从辅助线程执行此操作的原因之一是因为添加大量项目需要太长时间,并且它会挂起您的用户界面。正确的方法是使用虚拟列表控件(如@Erik提到的“重复”问题中所述),或者在添加项目时定期调用wxYield(或wxSafeYield)以便处理UI事件。

答案 1 :(得分:0)

** * ** * ** * 的** * ** * ** * ** * ** * 的** * ** * ** 解决方案在这里 * ** < EM> * ** * ** * ** * ** * ** < /强>

我在线程中使用了代码[它从数据库获取一行并传递给事件] void * MyThread :: Entry()

{

    List_Ctrl_Data obj1 ;
    MYSQL_RES *database_table_data;
    database_table_data=obj1.getdata();
    MYSQL_ROW row;
    while((row=mysql_fetch_row(database_table_data))!=NULL)
        {

            wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, 100000 );
            void *row_data;
            row_data=(void *)row;
            event.SetClientData(row_data);
            temp->GetEventHandler()->AddPendingEvent( event );
            this->Sleep(1000);

        }


}

为了处理这个问题,我们创建了一个事件表和一个处理这个值的函数 -     void onNumberUpdate(wxCommandEvent&amp; evt);         私人的:     DECLARE_EVENT_TABLE() 在头文件和cpp文件中我们写

void login :: onNumberUpdate(wxCommandEvent&amp; evt)

{

    int i=0,j;

    void* hold_row;

    hold_row=(void *)evt.GetClientData();

    MYSQL_ROW row;

    row=(MYSQL_ROW)hold_row;

    //while(row!=NULL)

    //{

        //wxPuts(wxT("kjhjkh"));

        const char* chars1 = row[0];

        wxString mystring1(chars1, wxConvUTF8);

        long index=data_list_control->InsertItem(this->counter,mystring1);
    this->counter++;

        for(j=1;j<3;j++)

            {

            const char* chars2=row[j];

            wxString mystring2(chars2,wxConvUTF8);

            data_list_control->SetItem(index,j,mystring2);
            }

    //}

}

BEGIN_EVENT_TABLE(登录,wxFrame) EVT_COMMAND(100000,wxEVT_COMMAND_TEXT_UPDATED,login :: onNumberUpdate)

END_EVENT_TABLE()

最后我得到了我的问题的解决方案//////

www.rohitworld.site90.net或ROHITAMITPATHAK@GMAIL.COM