Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выводить данные из потока в диалоговое окно 
:(
    Опции темы
BBulat
Дата 17.2.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Создал MFC-приложения основанное на диалоговом окне. В окне два списка, в которые пытаюсь выводить данные, считываемые из USB-девайса. Данные записываю в переменную списка in1_list с помощью метода InsertString. 
Код потока:
Код

UINT ReceiveThread( LPVOID pParam )
{
    CTestAPIDlg dlg;
    ULONG nBytes;
    DWORD lpErr;
    COMSTAT comstat; 
    DWORD AvaibleBytes;
    DWORD RealRead;    
    CString text;
    char buf_r[64];

    stop_r = 0;
    while(stop_r == 0)
    {
        RealRead = 0;
        ReadFile(PipeIn, &buf_r, 60, &RealRead, &gOverLapped_Read); 
            
        DWORD flag = WaitForSingleObject(hEvent_Read,100);    
        if(flag==WAIT_OBJECT_0)
        {
            GetOverlappedResult(PipeIn,&gOverLapped_Read,&RealRead,TRUE);
        }
        RealRead=0;
        int j = 0;
        for(int i=0; i<60; i++)
        {
              text.Format("%d",buf_r[i]);
              dlg.in1_list.InsertString(i,text);        
                        
        }

    }//while(stop_r == 0)
    return 0;
}


При выполнении строки dlg.in1_list.InsertString(i,text); вылазит ошибка "Debug Assertion Failed"
PM MAIL   Вверх
xTr1m
Дата 17.2.2010, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Имхо списка как такового пока еще не существует.  Ведь ты просто создал переменную
Код

CTestAPIDlg dlg;

В список можно будет вставлять, при созданном диалоге (dlg.DoModal(), например). Но тогда нужно будет немного переделывать существующий код
PM MAIL WWW ICQ   Вверх
SenkraD
Дата 17.2.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 4
Всего: 23



BBulat,  а что и на какой итерации цикла в assert'е пишется?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
BBulat
Дата 17.2.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Цитата(xTr1m @ 17.2.2010,  15:52)
Имхо списка как такового пока еще не существует.  Ведь ты просто создал переменную
Код

CTestAPIDlg dlg;

В список можно будет вставлять, при созданном диалоге (dlg.DoModal(), например). Но тогда нужно будет немного переделывать существующий код

Список создан и данные в него выводятся через методы класса диалогового окна.
Например, в другой список этого же окна я вывожу данные при нажатии кнопки с помощью метода AddString:
Код

//Start transmit
void CTestAPIDlg::OnBnClickedButton1()
{
    update = 1;
    CString str;

    out_list.ResetContent();
    int jj = 0;
    for(UINT i=0; i<256; i++)
    {
        out_buf[jj]   = 0x11;                //Команда
        out_buf[jj+1] = reverse(i);            //Адрес
        out_buf[jj+2] = ((i+1)&0x7)<<5;        //Данные
        out_buf[jj+3] = ((i+1)&0x7f8)>>3;
        out_buf[jj+4] = ((i+1)&0xf800)>>11;
        str.Format("%d", i);

        out_list.AddString(str);

        jj+=5;
    }    

}


Просто поток не относится к классу диалогового окна, поэтому я и ввел CTestAPIDlg dlg;

PM MAIL   Вверх
BBulat
Дата 17.2.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Цитата(SenkraD @ 17.2.2010,  15:54)
BBulat,  а что и на какой итерации цикла в assert'е пишется?

вас эта
_AFXWIN_INLINE int CListBox::InsertString(int nIndex, LPCTSTR lpszItem)
    { ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem); }
строка интересует. Тут вроде прога спотыкается.
PM MAIL   Вверх
dizzy1984
Дата 17.2.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

Репутация: 10
Всего: 25



Я так понимаю, что окно ты создаешь до запуска потока? Тогда у тебя непроинициализирована переменная dlg. Однако, даже если ты проинициализируешь ее корректным значением созданного окна, проблема будет иметь место. Дело в том, что mfc будучи однопоточной библиотекой не дает работать с окнами созданными в другом потоке. 
Мне кажется, самым хорошим решением здесь будет передача в функцию дескриптора окна и посылка сообщения на winapi
Код

::SendDlgItemMessage(static_cast<HWND>(param), <id списка>, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>( static_cast<LPCTSTR>( s ) ) );

PM MAIL   Вверх
BBulat
Дата 17.2.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 5.12.2006

Репутация: нет
Всего: нет



Цитата(dizzy1984 @ 17.2.2010,  16:34)
Я так понимаю, что окно ты создаешь до запуска потока? Тогда у тебя непроинициализирована переменная dlg. Однако, даже если ты проинициализируешь ее корректным значением созданного окна, проблема будет иметь место. Дело в том, что mfc будучи однопоточной библиотекой не дает работать с окнами созданными в другом потоке. 
Мне кажется, самым хорошим решением здесь будет передача в функцию дескриптора окна и посылка сообщения на winapi
Код

::SendDlgItemMessage(static_cast<HWND>(param), <id списка>, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>( static_cast<LPCTSTR>( s ) ) );

А если создать Windows Forms приложение, то я смогу из потока данные, например, через элемент DataGridView выводить?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0710 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.