Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программирование интерфейса RS232 
:(
    Опции темы
Gremlin
Дата 15.9.2006, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

uintptr_t _beginthread( 
   void( __cdecl *start_address )( void * ),
   unsigned stack_size,
   void *arglist 
);
делаю как в примере только своя функция в потоке а объявление тоже как и в примере
  _beginthread( ReadBuff, 0, NULL );
где
Код

void ReadBuff( void *dummy )
{
    
    repeat = 0;    /* _endthread implied */

}
компилю получаю еггог не может преобразовать void(void *) в void(_cdecl *)(void *) None of the functions whith this name in scope match the target type и что делать?

PM MAIL   Вверх
dumb
Дата 15.9.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



дык
Код

void _cdecl ReadBuff( void *dummy )
{
  repeat = 0;
}

PM MAIL   Вверх
Gremlin
Дата 17.9.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не там просил void(cdecl *)(void *) я сделал так объявил в хидере void (__cdecl *ReadABuffer)(void *dummy); без описания _beginthread( ReadABuffer, 0, NULL ); компилит без проблем но кагда я её пытаюсь описать эту функцию
void (__cdecl *ReadABuffer)(void *dummy)
{} то на на скобке вылезает еггог d:\C++_Project\Visual C++.NET\Kistler Measuring Hardware\MultiAmp.cpp(833): error C2470: 'ReadABuffer' : looks like a function definition, but there is no formal parameter list; skipping apparent body
тоесть функция выглядит как функция но не функция гыгы и не знаю что и сделать теперь smile

PM MAIL   Вверх
Gremlin
Дата 18.9.2006, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Возможно в компиляторе нужно чтото включить? хотя там мультитридинг стоит
PM MAIL   Вверх
GremlinProg
Дата 18.9.2006, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



это называется "гадание на кофейной гуще"
покажи код


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 18.9.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



для _beginthread callback должен выглядеть так:
Код

void __cdecl ReadBuff( void * ptr ){
  ...
}
а для _beginthreadex callback должен выглядеть так:
Код

unsigned __stdcall ReadBuff( void * ptr ){
  ...
}
обе функции порождают поток, только _beginthreadex дает больше параметров для настройки этого потока

void(__cdecl*FType)(void *) - это описание ТИПА функции(здесь имя типа FType)
void __cdecl func(void *) - это описание функции(здесь имя функции func)

разницу видишь?

Это сообщение отредактировал(а) GremlinProg - 18.9.2006, 17:55


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 19.9.2006, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ааааааа два дня сижу думаю твою дивизию тоесть я сделал так в хидере void (__cdecl *ReadABuffer)(void *dummy); а в цпп описываю не указатель а саму функцию void __cdecl ReadABuffer(void *dummy); блин как сразу не допенькалsmile огромное вам спасибо за хелп!!!
PM MAIL   Вверх
Gremlin
Дата 19.9.2006, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Такс серавно чото не получается вопщем у меня есть класс его хидер:
Код

#pragma once
#include "afxwin.h"


// CMultiAmp dialog

class CMultiAmp : public CPropertyPage
{
    DECLARE_DYNAMIC(CMultiAmp)

public:
    CMultiAmp();
    virtual ~CMultiAmp();

// Dialog Data
    enum { IDD = IDD_DIALOG2 };

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    RECT m_RectSpaceWhite;
    DECLARE_MESSAGE_MAP()
public:
    HANDLE hPort;
    virtual BOOL OnInitDialog();
    bool WriteABuffer(char* lpBuf, DWORD dwToWrite);
    CMultiAmp *MultiAmp; // временная переменная для хранений полей во вкладке MultiAmp
    //--- Переменные и обработчики Каналов
    ...
    //--- Переменные и обработчики Меток;
    ...
    //--- Переменные и обработчики Чувствительности
    ...
    //--- Переменные и обработчики единиц Чувствительности
    ...
    //--- Переменные и обработчики Диапазона
    ...
    //--- Переменные и обработчики Единиц измерения
    ...
    //--- Переменные и обработчики Фильтров
    ...
    //--- Переменные и обработчики Постоянной по времени
    ...
    
public:
    CMultiAmp& operator = (const CMultiAmp&); //операция присваивания
    void (__cdecl *ReadABuffer)(void *dummy);
    ...
};

СPP:

Код

// MultiAmp.cpp : implementation file
//

#include "stdafx.h"
#include "Kistler Measuring Hardware.h"
#include "MultiAmp.h"
#include ".\multiamp.h"
#include "RSSetup.h"
#include <process.h>    /* _beginthread, _endthread */




#define MAX_THREADS 2
#define BUF_SIZE 255

// CMultiAmp dialog

IMPLEMENT_DYNAMIC(CMultiAmp, CPropertyPage)
CMultiAmp::CMultiAmp()
    : CPropertyPage(CMultiAmp::IDD)
    
{
}

CMultiAmp::~CMultiAmp()
{
}
CMultiAmp& CMultiAmp::operator = (const CMultiAmp& cmultiamp)
{
...
    return *this;
}
void CMultiAmp::DoDataExchange(CDataExchange* pDX)
{
    CPropertyPage::DoDataExchange(pDX);
    ...
}


BEGIN_MESSAGE_MAP(CMultiAmp, CPropertyPage)
    ...
END_MESSAGE_MAP()


// CMultiAmp message handlers


//}    

BOOL CMultiAmp::OnInitDialog()
{
    CPropertyPage::OnInitDialog();
    // TODO:  Add extra initialization here
    

    //--- Начальная инициализация полей------
    // канал 1
    ...
    // канал 2
    ...
    // канал 3
    ...
    // ----------------------------------------    
    
    //--- Ограничения по вводу в поля
    ...
    

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

bool CMultiAmp::WriteABuffer(char* lpBuf, DWORD dwToWrite)
{    
    OVERLAPPED osWrite = {0};
    DWORD dwWritten;
    DWORD dwRes;
    BOOL fRes;

   // Create this write operation's OVERLAPPED structure's hEvent.
    osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (osWrite.hEvent == NULL)
    {
       // error creating overlapped event handle
        MessageBox("Error creating write event");
        return false; 
    }
    // Issue write.
    if (!WriteFile(hPort, lpBuf, dwToWrite, &dwWritten, &osWrite))
    {    
        if (GetLastError() != ERROR_IO_PENDING) 
        { 
            MessageBox("Error writing port"); 
            fRes = false;
        }
        else
        {
            // Write is pending.
            dwRes = WaitForSingleObject(osWrite.hEvent, INFINITE);
            switch(dwRes)
            {
                // OVERLAPPED structure's event has been signaled. 
                case WAIT_OBJECT_0:
                    if (!GetOverlappedResult(hPort, &osWrite, &dwWritten, FALSE))
                        fRes = FALSE;
                    else
                    // Write operation completed successfully.
                    fRes = TRUE;
                    break;
                
                default:
                    // An error has occurred in WaitForSingleObject.
                    // This usually indicates a problem with the
                    // OVERLAPPED structure's event handle.
                    fRes = FALSE;
                    break;
            }
        }
    }
    else
    {    
       // WriteFile completed immediately.
        fRes = TRUE;
    }

    CloseHandle(osWrite.hEvent);
    return fRes;
}
BOOL CMultiAmp::OnApply()
{
    // TODO: Add your specialized code here and/or call the base class
    // --- набор команд ---

    //------------------------ 1 Канал -------------------------
    
    ...
    //------------------------ 2 Канал -------------------------
    
    ...
    //------------------------ 3 Канал -------------------------
    ...
    
    WriteABuffer(&Command[0], strlen(Command));
    
    // ----- Чтение параметров ----------

    _beginthread( ReadABuffer, 0, NULL );

    _endthread();
    return CPropertyPage::OnApply();
}
void __cdecl ReadABuffer(void *dummy)
{
    //--- ответ ---
    CMultiAmp MultiAmp;
    HANDLE hPort = MultiAmp.GethPort();
    COMSTAT ComStat;
    DWORD dwMask, dwError;
    OVERLAPPED OverRead;
    CHAR Buf[1024];                         
    DWORD dwRead; 
    OverRead.hEvent = CreateEvent(NULL, true, false, NULL);
    if (OverRead.hEvent == NULL) 
        AfxMessageBox("Error creating write event");
//

//    
    if  (!WaitCommEvent(hPort, &dwMask, &OverRead)) 
    {
        if (GetLastError() == ERROR_IO_PENDING)
            WaitForSingleObject(OverRead.hEvent, INFINITE);
        else 
            AfxMessageBox("Error waiting port event");
        
    }
//    if (!ClearCommError(hPort, &dwError, &ComStat))
//           MessageBox("Error clearing port"); 
//    
//    dwRead = ComStat.cbInQue; 
//    if (dwRead > 0) 
//    {
//        if (!ReadFile(hPort, Buf, dwRead, &dwRead, &OverRead)) 
//             MessageBox("Error reading port");
//    }
//    // В  Buf находятся прочитанные байты
//    // Далее идет  обработка принятых байтов
}

/// далее идут обработчики событий


И блин если я так объявляю то члены класса не видны в функции ReadABuffer 
а мне нужно чтоб это все в классе делалось smile или подскажи другую реализацию
PM MAIL   Вверх
GremlinProg
Дата 19.9.2006, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Код

class CMultiAmp : public CPropertyPage{
    ...
public:
    //    StaticReadABuffer - статический callback
    static void __cdecl StaticReadABuffer(void *dummy){
        ((CMultiAmp*)dummy)->ReadABuffer();
    }
    ...
    BOOL OnApply()
    {
        ...
        HANDLE hstream    = (HANDLE)_beginthread(StaticReadABuffer,0,(void*)this);
        WaitForSingleObject(hstream,INFINITE);
        //    WaitForSingleObject не вернет результат, пока поток не завершится,
        //    в данном случае, пока не выполнится процедура ReadABuffer
        //    _endthread() вызывать не нужно, иначе поток завершится преждевременно
        //    WaitForSingleObject можешь поставить в любое нужное тебе место,
        //    но тогда и hstream должен быть виден в классе
        ...
    }
    ...
    void ReadABuffer(void){
        // здесь работаешь уже с классом в потоке
        GethPort();
        ...
    }
    ...
};



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 19.9.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ага сибо мудреное объявление но вроде робитsmile


Это сообщение отредактировал(а) Gremlin - 19.9.2006, 18:25
PM MAIL   Вверх
GremlinProg
Дата 19.9.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



у меня не ругается, компилер другой, вынеси реализацию этих методов в cpp или хотя бы StaticReadABuffer


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 19.9.2006, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

void CMultiAmp::ReadABuffer(void)
{
    OVERLAPPED OverRead = {0};
    COMSTAT ComStat;
    DWORD dwMask, dwError;
    char Buf[1024];                         
    DWORD dwRead; 
    if (!SetCommMask(hPort, EV_RXCHAR)) 
        MessageBox("Error setting port mask");
    OverRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if (OverRead.hEvent == NULL) 
        MessageBox("Error creating write event");
    if  (!WaitCommEvent(hPort, &dwMask, &OverRead)) 
    {
        if (GetLastError() == ERROR_IO_PENDING)
            WaitForSingleObject(OverRead.hEvent, INFINITE);
        else 
            AfxMessageBox("Error waiting port event");
        
    }
    if (!ClearCommError(hPort, &dwError, &ComStat))
           MessageBox("Error clearing port"); 
    
    dwRead = ComStat.cbInQue; 
    if (dwRead > 0) 
    {
        if (!ReadFile(hPort, Buf, dwRead, &dwRead, &OverRead)) 
             MessageBox("Error reading port");
    }
    // В  Buf находятся прочитанные байты
    // Далее идет  обработка принятых байтов
}

Но я думал что создав другой поток я смогу работать с остальным приложением нормально а оно виснет и ждет ответа с ком порта


Это сообщение отредактировал(а) Gremlin - 19.9.2006, 18:54
PM MAIL   Вверх
GremlinProg
Дата 19.9.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GremlinProg @  19.9.2006,  12:09 Найти цитируемый пост)
WaitForSingleObject не вернет результат, пока поток не завершится

Ну убери WaitForSingleObject вообще, либо поставь перед завершением программы.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gremlin
Дата 19.9.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(GremlinProg @  19.9.2006,  19:01 Найти цитируемый пост)
Ну убери WaitForSingleObject вообще, либо поставь перед завершением программы. 
 А как лучше её внутри ReadABuffer или после закрытия потока?


Это сообщение отредактировал(а) Gremlin - 19.9.2006, 19:38
PM MAIL   Вверх
GremlinProg
Дата 19.9.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Я говорю вот про вэйт после создания потока :
Код

        HANDLE hstream    = (HANDLE)_beginthread(StaticReadABuffer,0,(void*)this);
        WaitForSingleObject(hstream,INFINITE);

Убери его пока, чтобы ничего не висло. Правильнее будет поставить его перед завершением программы, например в WM_DESTROY (это только в случае, если нужно освободить какие-нибудь ресурсы, используемые в потоке, например буфер, в который ты складываешь инфу с кома или сбросить буфера в файл и т.п.)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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