Wątek(z FileExists) + OpenDialog = błąd

dział ogólny

Re: Wątek(z FileExists) + OpenDialog = błąd

Nowy postprzez GoldWolf » wtorek, 16 czerwca 2009, 18:38

Cyfrowy Baron napisał(a):Porada z której korzystasz jest tak stara, że aż dziw bierze iż ktoś jeszcze z tego korzysta.

Lepiej skorzystać z klasy TThread, o czym było już gdzieś na tym forum, niżej masz prosty przykład użycia tej klasy:

Po skopiowaniu kodu dla testu, mam taki błąd :[C++ Error] Unit5.cpp(41): E2285 Could not find a match for 'TThread::Synchronize(void)'

Dobra już znalazłem rozwiązanie.
Trzeba użyć referencji & Synchronize(&get_p);
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wątek(z FileExists) + OpenDialog = błąd

Nowy postprzez GoldWolf » wtorek, 16 czerwca 2009, 21:28

Dziękuje wszystkim za rady, ale żadna z nich nie rozwiązuje mojego problemu. Ponieważ nie wiem gdzie przy opisywaniu problemu popełniam błąd, iż nie umiem wam wytłumaczyć o co chodzi. Dlatego tu jest mój kod, który myślę po uruchomieniu i postępowaniu zgodnie z opisem pozwoli na zrozumienie błędu z którym się borykam. Jest to kod wzorowany na wskazanym przez Cyfrowego.
Kod: Zaznacz cały
//---------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------
class myThread : public TThread{
   TForm1 *tForm;
protected:
   void __fastcall get_p(void);
   void __fastcall Execute(void);

public:

   // __fastcall myThread(TForm1 *Form);
   myThread(TForm1 *_form):TThread(true), tForm(_form){}
};
/*__fastcall myThread::myThread(TForm1 *Form)
  : TThread(Form)
{
tForm = Form;
}  */
//---
/*void _fastcall myThread::get_p(void)
{

} */
void __fastcall myThread::Execute(void){
/*while(1)
{
  Synchronize(get_p);
} */
using std::string;
using std::ifstream;
ifstream plik;
string wiadomosc;

if (FileExists("b.txt")) {
   plik.open("b.txt");
   if (plik.is_open()) {
      getline(plik, wiadomosc);
   }else{
      tForm->Label1->Caption = "Błąd odczytu pliku b.txt";
   }
   plik.close();
      tForm->Label1->Caption = wiadomosc.c_str();
}else
   tForm->Label1->Caption = "Błąd nie odbaleziono pliku b.txt";
}
//-----------------------------------------------------------------
myThread* thread;
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner){
   thread = new myThread(Form1);
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender){
   thread->Resume();
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender){
straznik = 0;
OpenDialog1->InitialDir = "c:\\"; //katalog początkowy
if(OpenDialog1->Execute()){
   if(!OpenDialog1->FileName.IsEmpty()){ //zabezpieczenie przed pustą nazwą
      nazwa_pliku = OpenDialog1->FileName.c_str();
//      if(ExtractFileExt(OpenDialog1->FileName).AnsiCompareIC("txt") == 0)
/*      if (nazwa_pliku.find(".txt") != std::string::npos)
         straznik = 1;   */
   }
}
}
//-----------------------------------------------------------------
Nie jestem pewien ale chyba w moim przypadku nie trzeba synchronizacji. Dobra w załączniku jest gotowy program. Więc przeprowadźcie dwie próby:
1.Naciśnij tylko guzik 1 -> zobacz wynik.
2.Ponownie uruchom naciśnij guzik2 wskaż jakikolwiek plik txt, a potem guzik1 -> zobacz wynik.

Jak pewnie zauważycie wyniki się różnią, ja nie wiem dlaczego. Jak już trzeci raz podkreślam myślę, iż FileExists("b.txt") przy próbie nr 2 nigdy nie będzie true, chyba że wskażesz plik b.txt (ale nie tak to ma działać). Wiem, że chodzi o tą część OpenDialog1->InitialDir = "c:\\";, tylko dlaczego do działa na FileExists tego już nie wiem. Gdybym wrzucił na dysk c: plik b.txt to będzie ok co potwierdza, iż po wywołaniu OpenDialog1->InitialDir = "c:\\"; dla całej aplikacji domyślna jest ścieżka c:.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wątek(z FileExists) + OpenDialog = błąd

Nowy postprzez GoldWolf » wtorek, 16 czerwca 2009, 21:30

Rozwiązałem problem stosując coś takiego:
Kod: Zaznacz cały
wiadomosc = ExtractFilePath(ParamStr(0)).c_str();
wiadomosc += "b.txt";
if (FileExists(wiadomosc.c_str())){
Czy ktoś zna inny sposób ?

Aha jeszcze jedno jak w ciele wątku go zakończyć?
Kod: Zaznacz cały
void __fastcall myThread::Execute(void){
//co wpisać by go zakończyć w tym miejscu
}
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wątek(z FileExists) + OpenDialog = błąd

Nowy postprzez banita » wtorek, 16 czerwca 2009, 21:52

co komu po pliki binarnym?

aby zakonczyc watek TThread nalezy wlasciwosc Terminated dac na true za pomoca metody Terminate(). taka czynnosc wykonuje sie z poziomu watku wywolujacego owy watek a nie w nim samym. jesli watek ma sam sie zakonczyc na podstawie jakichs wartosci danych etc.. to poprostu nalezy zakonczyc metode Execute, wychdozac z petli, returnem czy cos...
Avatar użytkownika
banita
Kreacjusz
Kreacjusz
 
Posty: 283
Dołączył(a): poniedziałek, 28 lipca 2008, 20:07
Podziękował : 1
Otrzymał podziękowań: 18
System operacyjny: Windows 7 Professional
Kompilator: C++Builder 2010 Update 5,
Delphi 2010 Update 5,
NetBeans 6.9(MinGw + Qt),
Visual Studio 2008 + Qt
Gadu Gadu: 0
    NieznanyNieznana

Re: Wątek(z FileExists) + OpenDialog = błąd

Nowy postprzez GoldWolf » czwartek, 18 czerwca 2009, 22:17

banita napisał(a):co komu po pliki binarnym?

aby zakonczyc watek TThread nalezy wlasciwosc Terminated dac na true za pomoca metody Terminate(). taka czynnosc wykonuje sie z poziomu watku wywolujacego owy watek a nie w nim samym. jesli watek ma sam sie zakonczyc na podstawie jakichs wartosci danych etc.. to poprostu nalezy zakonczyc metode Execute, wychdozac z petli, returnem czy cos...

Kontynuacja w innym temacie. Dzięki za debatę na temat wątku i OpenDialog.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 1 gość

cron