wxWidgets - pobieranie pliku w wątku

0

Witam,

Próbuję zaimplementować proste pobieranie pliku w wxWidgets. Pobieranie powinno byc w oddzielnym watku, tak by gui nie bylo blokowane. Jednak w rezultacie gui i tak jest blokowane i nie mam pojecia dlaczego.

Napisze po kolei co robilem. Najpierw deklaracja nowego watku, a wygląda to tak:

class MyThread : public wxThread
{
public:
    MyThread(test1Dlg *frame);


    virtual void *Entry();


    virtual void OnExit();


    void SetProgress(int pos);

public:
    test1Dlg *m_frame;
};

MyThread::MyThread(test1Dlg *frame)
        : wxThread()
{

    m_frame = frame;
}

void MyThread::SetProgress(int pos)
{
  
 
    wxMutexGuiEnter();

    m_frame->SetProgress(pos);

    wxMutexGuiLeave();
}

void MyThread::OnExit()
{

}

Metoda SetProgress robi tylko tyle, ze ustawia pozycje paska postepu w oknie.

Teraz najwazniejsza czesc - samo pobieranie pliku:

void *MyThread::Entry()
{

wxString m_strURL = "http://j.o2.pl/idi/tleninst60269.exe";
wxString m_strFile = "tleninst60269.exe";


char c = 0;
int bytesread = 0;
double m_nFileSize;



	wxURL Url(m_strURL);
	if (Url.GetError() == wxURL_NOERR)
	{

		((wxProtocol &)Url.GetProtocol()).SetTimeout(100);


		wxInputStream *pIn_Stream = Url.GetInputStream();

		if(pIn_Stream)
		{
			m_nFileSize = pIn_Stream->GetSize();


			wxFile file;
			double nCount = 0;
			file.Create(m_strFile, true);
			while ((bytesread = (int)(pIn_Stream->Read(&c, 1)).LastRead()) > 0 && !TestDestroy() )
			{
				file.Write((const void *)&c, bytesread);
				nCount += bytesread;
				SetProgress((100*nCount)/m_nFileSize);

			}
			file.Close();
			delete pIn_Stream;

		}

	}



    return 0;

}

Uruchamianie wątku pobierania (this to moje okno):

MyThread *t = new MyThread(this);
 t->Create();
 t->Run();

Co sie dzieje? Owszem, plik jest pobierany, ale jezeli tylko "dotkne" gui (nawet porusze mysza nad oknem), to od razu uzycie procesora skacze do maksimum, gui jest zablokowane - slowem jest tak, jakby pobieranie odbywala sie bez uzycia nowego wątku. Nie ma znaczenia, czy ustawiam pozycje progressBara czy nie, jezeli nie uzywam metody SetProgress, dzieje sie to samo. Dlaczego?

Jezeli do Entry() wstawie jakas glupote, np nieskonczona petle, to takiej sytuacji nie ma. Co jest nie tak?

0

No jak odczytujesz po jednym bajcie i co bajt odświeżasz postęp, to nie dziw się, że tak to działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1