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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация поточности и цикл For() 
:(
    Опции темы
2faust
Дата 12.3.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



добрый.

вы мне не поможите решить след. проблему, которая заключается в след-щем :
1)на устройство подается набор данных -> настрайваемся на частоту транспондера ->начинается запись с данной частоты если есть сигнал с платы, если обьеем файла достигает 100 Мб, файл закрывать, открывать подобный файл.00N и продолжать запись. Если общий рамер файл,т.е.сумма всех разбитых = 700 Мб, остановить запись.
Иногда на устройстве пропадает сигнал, для этого я ввел инкремент, если сигнала нету и if(инкремент++ = 200) то останавливаю запись, противном случае инкремент-- и запись в файл продолжается.
Этот пункт выполняется на отлично, вопросов нету.

2)Когда на устройство падаю массив частот, плата настраивается последовательно на частоты, которые последовательно поступают из массива.
Когда настроились на 1-ую частоту(ppfreq[0]) производяться дополнительные настройки и запись начинается. 
Проблема заключается в том, что иногда на устройстве пропадает сигнал, у меня запись для текущей частоты останавливается и начинается для след-ей и так для всех частот, что не есть хорошо.

Как я понимаю надо ввести в for(int i=0; i < /*m_pOSDDlg->transpod_str_i*/2; i++){..} ф-цию, которая должна проверять состояние предедущего процесса.
Предедущий процесс, должен заканчиваться в двух случаях:
1) либо инкремент++ = 200 
2) либо достигли максимального размера файла
после чего предедущ. процесс должен останавливаться и начинаться след. инкремент в цикле for(int i=0; ;)

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

Вы не могли бы мне помочь, как правильно надо определить этот мьютекс и где его надо изменять.

я Вам даю некоторую часть кода, сверху вниз они описываются как вызываются.

Код


void CTunerDlg::OnButtonApply() // отдаю устройству набор данных
{
    if (m_pOSDDlg->myset) // Add
    {
        for(int i=0; i < /*m_pOSDDlg->transpod_str_i*/2; i++)
        {
        // частота
        m_strFrequenz = m_pOSDDlg->ppfreq[i];

        //скотрость
        CString symbolrate = m_pOSDDlg->ppsymbolrate[i];
             

        flag1 = true;

        //поляризацию
        bool bHoriz = m_pOSDDlg->pppolar[i] == _T("H");
        m_iPolarisation = !bHoriz; 

        if ( bHoriz) // устанавливаю поляризацию 'H' или 'V'
        { .. }
        else
        { .. }


        UpdateData(false); 

        BeginWaitCursor();
        SetValuesEvent(); // устанавливаем дополнительные настройки(LOF,Pol,DiseqC)
        EndWaitCursor();

        m_pOSDDlg->OnButtonTsStart(); // эмулирую кнопку начать запись
        } // for()

    } // if (m_pOSDDlg->myset)
    else
    {
    

      m_strFrequenz = m_pOSDDlg->freq;
      
      CString symbolrate = m_pOSDDlg->symbolrate;
      
      // в ресурсе ищу уже существующие строки    
        int pos = m_ctrlSymbolRate.FindStringExact(-1, symbolrate); 
        if(pos == CB_ERR)  pos = m_ctrlSymbolRate.InsertString(-1, m_strSymbRate);
        if(pos != CB_ERR)  pos = m_ctrlSymbolRate.SetCurSel(pos);
        
        bool bHoriz = m_pOSDDlg->polar[0] == _T('H');
        m_iPolarisation = !bHoriz;
        
        if ( bHoriz) // устанавливаю поляризацию 'H' или 'V'
        { .. }
        else
        { .. }
        
        UpdateData(false);        
      
        BeginWaitCursor();
        SetValuesEvent(); 
        EndWaitCursor();
    }

}


void COSDDlg::OnButtonTsStart() 
{
    UpdateData(TRUE);

#ifdef _TS_RECORD

    CString strFileName;
    CTime ct;
    
    CString strFreq = "00000000";

    ZeroMemory(&ch, sizeof(CDVBFrontend::CHANNEL_TYPE));

    // определяемся с названием файла
    ct = CTime::GetCurrentTime();
    strFileName =  m_strFolder;
    strFileName += "TS_" + strFreq;
    strFileName += ct.Format("_%Y_%m_%d__%H_%M_%S");
    strFileName += ".ts";


    if( ! m_TSRecord.Start(strFileName, m_iFileSize, maxFileSize, maxRecordDuration)) // BOOL CMyTSRecord::Start()
        MessageBox("TS-Record Start failed!", "Error");
    else
        GetDlgItem(IDC_BUTTON_TS_START)->EnableWindow(FALSE);

#endif
}


BOOL CMyTSRecord::Start(CString strFileName, int iSplitSize, DWORD maxFileSize, DWORD maxRecordDuration)
{
    Stop();

    m_strFileName = strFileName;
    m_MaxFileSize = maxFileSize;
    m_MaxRecordDuration = maxRecordDuration;

    switch(iSplitSize)
    {
        // определяемся с разбиением файла
    }
    
    
    if(m_File.Open(strFileName, CFile::modeCreate | CFile::modeWrite)) // открывем файл для записи
    {
        if(m_BoardControl.TSRecordOnOff(TRUE)) // обращаемся к устройству, что готовы записывать поток, TSRecordOnOff()- SDK'шная ф-ция
        {
            if(StartThread(/*THREAD_PRIORITY_HIGHEST*/)) // BOOL CWorkerThread::StartThread() - !!
            {
                return TRUE;
            }
        }
    }
    return FALSE;
}


// некоторое описание класса
class CWorkerThread  
{
public:
    CWorkerThread();
    virtual ~CWorkerThread();

    BOOL StartThread(int iPriority = THREAD_PRIORITY_NORMAL);
    BOOL StopThread(DWORD dwTimeout = STOP_THREAD_TIMEOUT);
    BOOL IsRunning();
    BOOL GetThreadInfo(CWinThread*& pThread, DWORD& dwThreadID, int& iThreadPriority, time_t& tStartTime);

    static UINT WorkerThread(LPVOID pParam);

protected:
    virtual BOOL Run(); // !!
    
private:
    CCriticalSection m_CriticalSection;  // !!
    volatile long m_lRunThread;
    CWinThread* m_pThread;
    time_t m_tStartTime;
    int m_iThreadPriority;
    DWORD m_dwThreadID;
};


// некоторое описание класса
class CMyTSRecord : protected CWorkerThread
{
public:
    BOOL Start(CString strFileName, int iSplitSize, DWORD maxFileSize, DWORD maxRecordDuration);
    BOOL Stop(CString* p_strTunerParams = NULL);
    COSDDlg* m_pOSDDlg;
private:
    BOOL Run();         // !!
    CString GetNewFileName(int n);

};


BOOL CWorkerThread::StartThread(int iPriority)
{
    m_CriticalSection.Lock();
    if(m_lRunThread == 0)
    {
        m_lRunThread = 1;

        m_pThread = AfxBeginThread(CWorkerThread::WorkerThread, // функция контролирующая многопоточность
                                                                this,    // указатель на обьект, который будет контролировать многопоточность
                                                                iPriority);
        
        if (m_pThread != NULL)
        {
            CTime t = CTime::GetCurrentTime();
            m_tStartTime = t.GetTime();

            m_iThreadPriority = m_pThread->GetThreadPriority();
            m_dwThreadID = m_pThread->m_nThreadID;

            m_CriticalSection.Unlock();
            
            //TRACE("Start WorkerThread success!!!\n");
            return TRUE;
        }
        else
        {
            m_lRunThread = 0;
        }
    }
    m_CriticalSection.Unlock();
    return FALSE;
}


UINT CWorkerThread::WorkerThread(LPVOID pParam)
{
    CWorkerThread* pWorkerThread;

    //TRACE("Enter WorkerThread\n");
    pWorkerThread = (CWorkerThread*) pParam;

    while(pWorkerThread->m_lRunThread == 1)
    {
        if(! pWorkerThread->Run())
        {
            break;
        }
    }
    pWorkerThread->m_CriticalSection.Lock();
    pWorkerThread->m_lRunThread = 0;
    pWorkerThread->m_pThread = NULL;
    //pWorkerThread->m_tStartTime = 0;
    pWorkerThread->m_iThreadPriority = THREAD_PRIORITY_ERROR_RETURN;
    pWorkerThread->m_dwThreadID = 0;
    pWorkerThread->m_CriticalSection.Unlock();
    
    //TRACE("Leave WorkerThread\n");
    return 42;
}

BOOL CWorkerThread::IsRunning()
{
    if(m_lRunThread == 1) return TRUE;
    else                  return FALSE;
}

BOOL CWorkerThread::Run()
{
    return TRUE;
}


BOOL CMyTSRecord::Run()   // Вот главная ф-ция, где начинается запись в файл
{
    int retlen, n;
    __int64 filelen;
    BYTE* Buf;

    int incr = 0; // Add

    Buf = new BYTE[1000000]; // 1 MB
    if(! Buf)
        return FALSE;

    while(IsRunning())
    {
        if((m_MaxFileSize != 0) && (m_cnt/1048576 >= m_MaxFileSize)) // MByte
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }


        if((m_MaxRecordDuration != 0) && ((GetTickCount() - m_tc)/60000 >= m_MaxRecordDuration)) // Minutes
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }

        retlen = m_BoardControl.TSRecordRead(Buf, 1000000); // 1 MB - получаем поток с устройста и записываем во переменн.
        
        if(retlen == 0) // 
        {
            if((incr++) == 200) // а вот и инкремент, запись прекратить
            {
                m_pOSDDlg->MessageBox(" Stop Record ", "InFo", MB_OK | MB_ICONWARNING);
                
                if( m_File != NULL) 
                { 
                    m_File.Close(); 
                    m_pOSDDlg->MessageBox("Close File for writing ! ", "InFo", MB_OK); 
                }
            
                m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));

                break;

            }
            
        }

        if((retlen > 0) && (m_File.m_hFile != CFile::hFileNull))
        {
            // Add
            if( ((incr--) < 0) || (incr == 0)) 
            {
                incr = 0; 
            }
            // end Add

            if((m_SplitSize != 0) && ((filelen + retlen) >= m_SplitSize)) // условие на разбиение файла
            {
                m_File.Close();
                filelen = 0;
                n++;
                if(! m_File.Open(GetNewFileName(n), CFile::modeCreate | CFile::modeWrite)) // открываем новый файл с именем определяющейся GetNewFileName(n), т.е. темже именем но '.001'
                {
                    Sleep(100);
                    //Stop();
                    continue;
                }
            }

            m_File.Write(Buf, retlen);
            m_cnt += retlen;
            filelen += retlen;
        }
        else
            Sleep(20);
    } // while(IsRunning())

    if(Buf)
        delete Buf;

    m_tc = GetTickCount() - m_tc;

    return FALSE;
}



Это сообщение отредактировал(а) 2faust - 13.3.2009, 15:27
PM MAIL   Вверх
2faust
Дата 13.3.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




люди хелп, ну очень нужна помощь.
никак не получается.
как толково сделать так, чтобы запись для следующего эл-та из массива начиналась только тогда, когда для предедущего эл-та из массива выполнись только 2 условия:
1) вышли за инкремент 200
2)достигли масксимального размера файла.
PM MAIL   Вверх
Lazin
Дата 13.3.2009, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



2faust, твой код слишком большой, в нем слишком долго разбираться, да и вряд-ли это возможно, так-как он неполный, к тому-же он специфичен для твоей задачи, в которой никто разбираться не будет
если можешь, сведи свой код к более простому случаю, что-бы там кроме проблемы ничего не осталось, тогда кто-нибудь поможет
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 13.3.2009, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



для работы с устройствами как правило помогают конечные автоматы
еще говорят что надо отделять обработку от интерфейса и разбивать код на модули и\или классы
PM MAIL ICQ   Вверх
2faust
Дата 14.3.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот попытался убрать многое, но основное всетаки оставил.
надеюсь код теперь более абстрактный :

Код


void Klass_1::OnButtonApply() // отдаю устройству набор данных
{
        BeginWaitCursor();
        for(int i=0; i < кol_vo_str; i++)
        {
        // частота
        Freq = arr[i];

        EndWaitCursor();

        СKlass_3->OnButtonStart(); // эмулирую кнопку начать запись
        } // for()
}


void СKlass_3::OnButtonStart() 
{

    // определяемся с названием файла
    ct = CTime::GetCurrentTime();
    strFileName =  m_strFolder;
    strFileName += "TS_" + strFreq;
    strFileName += ct.Format("_%Y_%m_%d__%H_%M_%S");
    strFileName += ".ts";


    m_TSRecord.Start(strFileName, m_iFileSize, maxFileSize, maxRecordDuration)) // BOOL CKlass_2::Start()
}

// некоторое описание класса
class CKlassThread  
{
public:

    BOOL StartThread(..);
    BOOL StopThread(..);
    BOOL IsRunning(..);
    BOOL GetThreadInfo(CKlassThread*& pThread, DWORD& dwThreadID, int& iThreadPriority, time_t& tStartTime);

    static UINT WorkerThread(LPVOID pParam);

protected:
    virtual BOOL Run(); // !!
    
private:
    CCriticalSection m_CriticalSection;  // !!
    volatile long m_lRunThread;
    CWinThread* m_pThread;
    time_t m_tStartTime;
    int m_iThreadPriority;
    DWORD m_dwThreadID;
};


// некоторое описание класса
class CKlass_2: protected CKlassThread
{
public:
    BOOL Start(..);
    BOOL Stop(..);
private:
    BOOL Run();         // !!

};


BOOL CKlassThread::StartThread(int iPriority)
{
    m_CriticalSection.Lock(); // !!
    if(m_lRunThread == 0)
    {
        m_lRunThread = 1;

        m_pThread = AfxBeginThread(CKlassThread::WorkerThread, this, iPriority);
        
        if (m_pThread != NULL)
        {
            m_iThreadPriority = m_pThread->GetThreadPriority();
            m_dwThreadID = m_pThread->m_nThreadID;

            m_CriticalSection.Unlock();
            
            //TRACE("Start WorkerThread success!!!\n");
            return TRUE;
        }
        else
        {
            m_lRunThread = 0;
        }
    }
    m_CriticalSection.Unlock(); // !!
    return FALSE;
}

UINT CKlassThread::WorkerThread(LPVOID pParam)
{
    CKlassThread* pWorkerThread;

    //TRACE("Enter WorkerThread\n");
    pWorkerThread = (CKlassThread*) pParam;

    while(pWorkerThread->m_lRunThread == 1)
    {
        if(! pWorkerThread->Run())
        {
            break;
        }
    }
    pWorkerThread->m_CriticalSection.Lock();  // !!
    pWorkerThread->m_lRunThread = 0;
    pWorkerThread->m_pThread = NULL;
    //pWorkerThread->m_tStartTime = 0;
    pWorkerThread->m_iThreadPriority = THREAD_PRIORITY_ERROR_RETURN;
    pWorkerThread->m_dwThreadID = 0;
    pWorkerThread->m_CriticalSection.Unlock();  // !!
    
    //TRACE("Leave WorkerThread\n");
    return 42;
}

BOOL CKlassThread::IsRunning()
{
    if(m_lRunThread == 1) return TRUE;
    else                  return FALSE;
}


BOOL CKlassThread::Run()
{
    return TRUE;
}

BOOL CKlass_2::Run()   // Вот главная ф-ция, где начинается запись в файл
{
    int retlen, n;
    int filelen;
    BYTE* Buf;

    int incr = 0;

    Buf = new BYTE[1000000]; // 1 MB
    if(! Buf)
        return FALSE;

    while(IsRunning())
    {
        if(Общий_размер_файла >= m_MaxFileSize) // общий размер файла = сумма всех частей однойменного файла
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }


        if((Продолжительность_записи >= m_MaxRecordDuration)) // Minutes
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }

        retlen = m_BoardControl.TSRecordRead(Buf, 1000000); // 1 MB - получаем поток с устройста и записываем во переменн.
        
        if(retlen == 0) // 
        {
            if((incr++) == 200) // запись прекратить
            {
                m_pOSDDlg->MessageBox(" Stop Record ", "InFo", MB_OK | MB_ICONWARNING);
                m_File.Close(); 
                m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));

                break;

            }
            
        }

        if((retlen > 0) && (m_File.m_hFile != CFile::hFileNull))
        {
            if( ((incr--) < 0) || (incr == 0)) { incr = 0;  }

            if((m_SplitSize != 0) && ((filelen + retlen) >= m_SplitSize)) // условие на разбиение файла
            {
                m_File.Close();
                filelen = 0;
                n++;
                if(! m_File.Open(GetNewFileName(n), CFile::modeCreate | CFile::modeWrite)) // открываем новый файл с именем определяющейся GetNewFileName(n), т.е. темже именем но '.001'
                {
                    Sleep(100);
                    //Stop();
                    continue;
                }
            }

            m_File.Write(Buf, retlen);
            m_cnt += retlen;
            filelen += retlen;
        }
        else
            Sleep(20);      // вот в этом месте после нескольких итераций в while(){} переходим к след. эл-ту массыва из for(){} ф--ции Klass_1::OnButtonApply()
    } // while(IsRunning())

    if(Buf)
        delete Buf;

    return FALSE;

}



если закрмментировать строчку  else {Sleep(20);} то процесс не начнется даже для однократного случая.

Это сообщение отредактировал(а) 2faust - 14.3.2009, 14:35
PM MAIL   Вверх
GremlinProg
Дата 14.3.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



может перенести твою тему в ЦП?
не думаю, что здесь будут вникать в проект


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


Новичок



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

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



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


BOOL CKlass_2::Run()   // Вот главная ф-ция, где начинается запись в файл
     while(IsRunning())
   {
...
        else
            Sleep(20);      // вот в этом месте после нескольких итераций в while(){} переходим к след. эл-ту массыва из for(){} ф--ции Klass_1::OnButtonApply()
    } // while(IsRunning())


мне никогда не приходилось встречаться с поточностью. для сишных примеров мне немног понятно, а вот для с++ уже сложнее. да и нормальных примеров реализации не могу найти, вот если бы были попытался бы разобраться.
уже какой день думаю, и никак  smile  smile 
PM MAIL   Вверх
Lazin
Дата 16.3.2009, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



ты можешь написать нормально, просто описать проблемму?
тут хватает людей которые могут твою проблемму решить, но тратить полчаса-час времени на это не каждыйникто не может себе позволить
нужно что-то вроде этого
Код

Data data_;//данные обрабатываемые в потоке
CRITICAL_SECTION data_lock_;//критичесская секция для данных

void run()
{
    while( IsRuning() )
    {
        ...сделать что-то
        EnterCriticalSection(&lock_);
        ...изменить общие данные
        LeaveCriticalSection(&lock_);
    }
}

далее должен идти твой вопрос о том, как этот код нужно изменить что бы получить то или иное поведение
если ты не можешь внятно сформулировать вопрос, то ответа ты скорее всего не получишь
PM MAIL Skype GTalk   Вверх
2faust
Дата 16.3.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



область локализции проблемы - след ф-ция 

Код


BOOL CKlass_2::Run()   // Вот главная ф-ция, где начинается запись в файл
{
    int retlen, n;
    int filelen;
    BYTE* Buf;

    int incr = 0;

    Buf = new BYTE[1000000]; // 1 MB
    if(! Buf)
        return FALSE;

    while(IsRunning())
    {
        if(Общий_размер_файла >= m_MaxFileSize) // общий размер файла = сумма всех частей однойменного файла
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }


        if((Продолжительность_записи >= m_MaxRecordDuration)) // Minutes
        {
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));
            break;
        }

        retlen = m_BoardControl.TSRecordRead(Buf, 1000000); // 1 MB - получаем поток с устройста и записываем во переменн.
        
        if(retlen == 0) // 
        {
            if((incr++) == 200) // запись прекратить
            {
                m_pOSDDlg->MessageBox(" Stop Record ", "InFo", MB_OK | MB_ICONWARNING);
                m_File.Close(); 
                m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));

                break;

            }
            
        }

        if((retlen > 0) && (m_File.m_hFile != CFile::hFileNull))
        {
            if( ((incr--) < 0) || (incr == 0)) { incr = 0;  }

            if((m_SplitSize != 0) && ((filelen + retlen) >= m_SplitSize)) // условие на разбиение файла
            {
                m_File.Close();
                filelen = 0;
                n++;
                if(! m_File.Open(GetNewFileName(n), CFile::modeCreate | CFile::modeWrite)) // открываем новый файл с именем определяющейся GetNewFileName(n), т.е. темже именем но '.001'
                {
                    Sleep(100);
                    //Stop();
                    continue;
                }
            }

            m_File.Write(Buf, retlen);
            m_cnt += retlen;
            filelen += retlen;
        }
        else
            Sleep(20);      // вот в этом месте после нескольких итераций в while(){} переходим к след. эл-ту массыва из for(){} ф--ции Klass_1::OnButtonApply()
    } // while(IsRunning())

    if(Buf)
        delete Buf;

    return FALSE;


}



проблемная область

Код

      ....
        else
            Sleep(20);      // вот в этом месте после нескольких итераций в while(){} переходим к след. эл-ту массыва из for(){} ф--ции Klass_1::OnButtonApply()
    } // while(IsRunning())


полсе i-того попадания в условие else{} выхожу из цикла.
как я понимаю Sleep(20) необходимо для операции ввода-вывода, в противном случае надобность в цикле while() нету.

как бы сделать так, чтобы я выходил при выполнении след. условия :

Код

        if(retlen == 0) // 
        {
            if((incr++) == 200) // запись прекратить
            {
                m_pOSDDlg->MessageBox(" Stop Record ", "InFo", MB_OK | MB_ICONWARNING);
                m_File.Close(); 
                m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));

                break;

            }
            
        }


incr - является переменая цикла

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

буду очень благодарен в помощи.
PM MAIL   Вверх
kolobok0
Дата 16.3.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(2faust @ 12.3.2009,  22:20)
добрый....

1) читать альма матер по многопоточности и вообще по Win32:
"WINDOWS для проффессионалов" Рихтера
2) юзать правильные функции для порождения многопоточности.
3) правильно пользоваться многопоточностью. Хотя бы ответить на вопрос себе - если Вам пофигу результат запуска потока, нафига его запускать?
4) почитать там же про системные объекты синхронизации.
5) правильно продумать архитектуру передачи-выемки в(из) потока данных.
6) Не юзать слиип для переключения потоков и "промывания железа" - это в вытесняющих средах изьян архитектуры а не удачное решение...

удачи Вам
(круглый)
PM MAIL   Вверх
2faust
Дата 1.4.2009, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



всем привет.

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

Код

void CTunerDlg::OnButtonApply() 
{
    //HANDLE MyEvent;
    //CEvent    MyEvent;

    //MyEvent = CreateEvent(NULL,TRUE/*режим запуска,TRUE-вручную*/,FALSE/*инициализ.*/,"EventiNo"); // Add

    if (m_pOSDDlg->myset) // Add
    {
        for(m_pOSDDlg->freq_i=0; m_pOSDDlg->freq_i < m_pOSDDlg->transpod_str_i; m_pOSDDlg->freq_i++)
        {
        
        BeginWaitCursor();

        if( m_pOSDDlg->freq_i!=0)
        {
            WaitForSingleObject(m_pOSDDlg->MyEvent[m_pOSDDlg->freq_i-1], INFINITE);
            m_pOSDDlg->MyEvent[m_pOSDDlg->freq_i-1].ResetEvent();
        }


        m_strFrequenz = "";
        m_strFrequenz = m_pOSDDlg->ppfreq[m_pOSDDlg->freq_i];
        m_strFrequenz += "000";
        
        ....
        m_pOSDDlg->OnButtonMyTsStart(); // emulition clicked button
        
        } // for()
}


Код

BOOL CMyTSRecord::Run()
{

    while(IsRunning()) // проверка состояния флага главного потока
    {
        
        if((m_MaxFileSize != 0) && (m_cnt/1048576 >= m_MaxFileSize)) // MByte
        {
            TRACE("Остановилась запись 1");
            m_pOSDDlg->PostMessage(WM_COMMAND, (BN_CLICKED<<16)|IDC_BUTTON_TS_STOP, (long)(m_pOSDDlg->GetDlgItem(IDC_BUTTON_TS_STOP)->m_hWnd));

            if( m_pOSDDlg->freq_i !=0 )
            {
                m_pOSDDlg->MyEvent[m_pOSDDlg->freq_i-1].SetEvent();
            }
            else 
            {
                m_pOSDDlg->MyEvent[0].SetEvent(); 
            }

            break;
        }
...



вопрос можно считать закрытым. 

все спасибо и удачи. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1407 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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