Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема синхронизации

841
06 мая 2009 года
_nic
199 / / 29.07.2006
Вот код формы с прогрессбаром
Код:
#include <vcl.h>
#pragma hdrstop

#include "Unit5.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm5 *Form5;
//---------------------------------------------------------------------------
void __fastcall TForm5::setdata(int size,int progres)
{
HANDLE mc=CreateMutex(NULL,false,"croncanv");
AnsiString outcap;
int index=size/100;
int out=progres/index;
if(out!=0)
{
if(size==progres){ProgressBar1->Position=100;Form5->Hide();}
WaitForSingleObject(mc,INFINITE);
ProgressBar1->Position=out;
outcap=AnsiString(progres)+" из "+AnsiString(size);
Label2->Caption=outcap;
ReleaseMutex(mc);
}//
}
__fastcall TForm5::TForm5(TComponent* Owner)
    : TForm(Owner)
{
}
..........................................................................................
#ifndef Unit5H
#define Unit5H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm5 : public TForm
{
__published:    // IDE-managed Components
    TProgressBar *ProgressBar1;
    TLabel *Label1;
    TLabel *Label2;
private:    // User declarations
public:     // User declarations
    __fastcall TForm5(TComponent* Owner);
    void __fastcall setdata(int size,int progres);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm5 *Form5;
//---------------------------------------------------------------------------
#endif

Прогресс бар должен индицировать копирование файла.Вывод из потока ,тот поток запущен средствами винапи.
Вот его часть
Код:
...........................
HANDLE f=CreateFile(outf,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_FLAG_RANDOM_ACCESS,0);
for(;;)
{
SetFilePointer(f,p,NULL,FILE_BEGIN);
sz=recv(s,bf,1024*120,0);
if(sz<1){break;}
WriteFile(f,bf,sz,&bw,NULL);
p=p+sz;pp=p;
HANDLE mc=CreateMutex(NULL,false,"croncanv");
WaitForSingleObject(mc,INFINITE);
ReleaseMutex(mc);
if((pp/(atoi(size)/100))>0)
{Form5->setdata(atoi(size),p);}
memset(bf,NULL,1024*120);
}
CloseHandle(f);
...........................

Переодически наблюдаю вылет с матюком "Canvas does not allow drawing"
Похоже что прорисовка канвы происходит медленее чем операция "Label2->Caption=outcap;" :( по этому мьютекс и не помагает :( Canvas->Lock() , Canvas->Unlock() непомагают код это этого только зависает.Как же можно синхронизироватся с отрисовкой канвы?
14
06 мая 2009 года
Phodopus
3.3K / / 19.06.2008
Читайте в справке чем отличается CreateThread() от beginthread() и класса TThread, что за зверь такой TThread.Synchronize() и зачем он нужен
841
06 мая 2009 года
_nic
199 / / 29.07.2006
Цитата: Phodopus
Читайте в справке чем отличается CreateThread() от beginthread() и класса TThread, что за зверь такой TThread.Synchronize() и зачем он нужен



Альтернатива этому есть?Ведь же наверно как то можно проверить состояние канвы?

14
07 мая 2009 года
Phodopus
3.3K / / 19.06.2008
Ну положим вы-то проверите состояние канвы. Но ведь VCL которую вы вызываете из другого потока на это не запрограмирована.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог