#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);
...........................
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() непомагают код это этого только зависает.Как же можно синхронизироватся с отрисовкой канвы?
Читайте в справке чем отличается CreateThread() от beginthread() и класса TThread, что за зверь такой TThread.Synchronize() и зачем он нужен
Цитата: Phodopus
Читайте в справке чем отличается CreateThread() от beginthread() и класса TThread, что за зверь такой TThread.Synchronize() и зачем он нужен
Альтернатива этому есть?Ведь же наверно как то можно проверить состояние канвы?
Ну положим вы-то проверите состояние канвы. Но ведь VCL которую вы вызываете из другого потока на это не запрограмирована.