как отобразить большие данные в wxListCtrl с использованием концепции wxThread - PullRequest
1 голос
/ 14 февраля 2011

Я способен заполнить таблицу базы данных в wxListCtrl, моя задача - обрабатывать большой диапазон данных, я хочу сделать это с помощью концепции потоков, возможно, это сохранит возможность повесить фрейм из-за большого количестваданные.Я новичок в концепции потоков, поэтому ваши отдельные строки будут для меня книгой.

Обновление:

Мой вопрос был - как отображать большие данные в wxListCtrl с использованием концепции wxThread, так чтоэто я использовал концепцию потока Я добавляю еще два файла thread.c и thread.cpp мой код потока ввода показан ниже

void *MyThread :: Entry()
{
    int i=1,j,k=0;
    while(i!=400)
    {
        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==30) {
            this->Sleep(1000);
            k=0;
        }
        i++;
    }
}

Иногда он работает нормально, но когда я пытаюсь увеличить значение i, он показывает ошибку типа

-*showingdatainwxlistctrl: ../../src/XlibInt.c:595: _XPrivSyncFunction: Assertion `dpy->synchandler == _XPrivSyncFunction' failed.*

или иногда выдает ошибку типа

***[Xcb] xcb_io.c:378: _XAllocID: Assertion `ret != inval_id' failed***

Почему это происходит со мной?

Ответы [ 2 ]

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

Вы можете определить свой собственный объект потока в wxWidgets следующим образом:

class MyThread : public wxThread
{
private:
    wxListCtrl* m_pListCtrl;
public:
    MyThread(wxListCtrl* pListCtrl, wxThreadKind kind = wxTHREAD_DETACHED) : 
        wxThread(kind), m_pListCtrl(pListCtrl) {
    }
    virtual ~MyThread() {
    }
    virtual void* Entry() {
        // here you have to place your code that will be running in separate thread
        // m_pListCtrl-> ...
    }
};

И это способ, которым вы можете запустить свой поток (предположим, у вас есть указатель pListCtrl здесь):

MyThread * pMyThread = new MyThread (pListCtrl);
wxThreadError ThreadError = pMyThread->Create();
if (wxTHREAD_NO_ERROR!=ThreadError) {
    wxLogError(L"Can not create thread, wxThreadError '%d'", (int)ThreadError);
    delete pMyThread;
    return false;
}
ThreadError = pMyThread->Run();
if (wxTHREAD_NO_ERROR!=ThreadError) {
    wxLogError(L"Can not run thread, wxThreadError '%d'", (int)ThreadError);
    delete pMyThread;
    return false;
}
// here, everything is ok.

В любом случае, это не лучшее решение вашей проблемы.Насколько я понял, вам нужно отобразить большой объем данных в вашем wxListCtrl.Для этого вы можете использовать виртуальный Ctrl (созданный с флагом wxLC_VIRTUAL) и предоставить источник данных:

class MyListCtrl : public wxListCtrl
{

public:
    MyListCtrl( ...) { ... }
    virtual ~MyListCtrl();
protected:
    virtual int OnGetItemImage(long item) const {
        // You need this only if you want to provide specific image for your item.
        // If you do not need it, just do not overload this method.
    }
    virtual wxString OnGetItemText(long item, long column) const {
        // This is where you have to provide data for [item, column].
        // Suppose, you have matrix A[n,m] which represents actually the data
        // you want to display. The elements of this matrix can be of any type
        // (strings, doubles, integers etc). 
        // You should return here wxString object that contains 
        // representation of the matrix's element A[item, column].
        return ToWxString(A[item, column]);
        // where ToWxString is your method that converts data to string
        // So, you do not need to load all the data from A to wxListCtrl.
        // Instead of it, wxListCtrl will determine which rows of the matrix should be
        // displayed based on sizes and scroll position of wxListCtrl, and will 
        // call this method to obtain corresponding strings.
    }
};

Для создания вы можете использовать:

m_pListCtrl = new MyListCtrl( ..., ..., wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_VIRTUAL | wxSUNKEN_BORDER | wxLC_VRULES | wxLC_HRULES);

С уважением!

0 голосов
/ 22 февраля 2011
  1. Когда вы выполняете большой диапазон данных, вы обязаны использовать WXThread в своей программе
  2. Сначала пытался заполнить wxListCtrl из точки wxEntry, это было неправильно, вы не можете нажать ни на один элемент управления основного потокаиз точки входа, это не выдает ошибку, но это неправильная концепция
  3. Здесь вам нужно передать данные в обработчик, обработчик будет использовать их для заполнения кода wxListCtrl следующим образом ->

    void * MyThread :: Entry () {int a;Обработчик handler_obj;char * database_name = DATABASE_NAME;connection = handler_obj.handler (101, имя_базы_данных);if (connection == NULL) {wxMessageBox (wxT («НЕ МОЖЕТ ПОДКЛЮЧИТЬ К БАЗЕ ДАННЫХ»), wxT («Сообщение»), wxOK | wxICON_INFORMATION, NULL, -1, -1);} else {List_Ctrl_Data list_ctrl_data_object;table_data = list_ctrl_data_object.fetch_table (connection);

        MYSQL_ROW row;
        while((row=mysql_fetch_row(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 Id_Search_Report::onNumberUpdate(wxCommandEvent& evt)
    {
        int j;
        void* hold_row;
        hold_row=(void *)evt.GetClientData();
        MYSQL_ROW row;
        row=(MYSQL_ROW)hold_row;

            const char* chars1 = row[0];
            wxString mystring1(chars1, wxConvUTF8);
            long index=data_list_control->InsertItem(this->counter,mystring1);
        this->counter++;
            for(j=1;j<12;j++)
                {
                const char* chars2=row[j];
                wxString mystring2(chars2,wxConvUTF8);
                data_list_control->SetItem(index,j,mystring2);
                }

    }

потоквозвращая строку, этот метод будет обрабатывать строку и заполнять ListCtrl, это правильный способ заполнения wxListCtrl.

...