заполнить таблицу базы данных в wxListCtrl с помощью wxThread - я могу заполнить, но система будет зависать - PullRequest
0 голосов
/ 17 февраля 2011

Сначала я делаю программу для отображения таблицы в wxListCtrl, она работала, но для ограниченного объема данных. это показывает проблему как: - когда я выполню программу. кадр делает видимым через некоторое время ... но работает затем я перехожу к использованию wxThread, теперь все идет хорошо, теперь, когда я выполняю программный фрейм, сразу видимый, потому что я пишу 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, с помощью потока я заполняю значение внутри wxListCtrl. некоторые люди советовали мне, что здесь вы снова и снова выбиваете управление кадром (wxListCtrl) из записи потока, Вот почему кадр зависает, вы должны использовать для этого wxPost или AddPendingRequest, я не думаю, что это будет работать, я пытался объяснить тебе мой вопрос, но ты все еще чувствуешь, что хочешь что-нибудь спросить, добро пожаловать ... если ты поможешь мне, это будет много для меня

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Проблемы, с которыми вы сталкиваетесь, вероятно, связаны с тем, что вы вызываете методы для элемента управления с графическим интерфейсом из вторичного потока, а не из основного потока. Это должно никогда быть сделано. Вам необходимо добавить элементы из основного потока.

Я предполагаю, что одна из причин, по которой вы пытались сделать это из вторичного потока, заключается в том, что добавление большого количества элементов занимает слишком много времени, и это вешает ваш пользовательский интерфейс. Правильный подход состоит в том, чтобы либо использовать элемент управления виртуальным списком (как отмечено в «дублирующем» вопросе, упомянутом @Erik), либо периодически вызывать wxYield (или wxSafeYield) при добавлении элементов для обработки событий пользовательского интерфейса.

0 голосов
/ 28 февраля 2011

******************************** РЕШЕНИЕ ЗДЕСЬ ******************

Я использовал код в потоке, как [он получает строку из базы данных и передает событие] 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 & evt);private: DECLARE_EVENT_TABLE () в заголовочном файле и в cpp-файле мы пишем

void login :: onNumberUpdate (wxCommandEvent & 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_COMDEXTTEXTMMAND (wxFrame) EVT_COMANDlogin :: onNumberUpdate)

END_EVENT_TABLE ()

и, наконец, я получил решение своей проблемы //////

www.rohitworld.site90.net ИЛИ ROHITAMITPATHAK@ GMAIL.COM

...