CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybki odczyt z pliku- podejście numer 2

Szybki odczyt z pliku- podejście numer 2

dział ogólny

Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » czwartek, 20 stycznia 2011, 18:47

Witam,

Już raz pisałem o tym problemie, ale słabo to wyszło więc po dalszych doświadczeniach, przedstawię problem dokładniej.

1. Mam na dysku pliki z danymi. Dane do tych plików są zrzucane za pomocą skryptu napisanego w języku MQL. Przy czym zaznaczyć muszę, że jeden odpalony skryp = 1 plik z danymi. http://docs.mql4.com/ Skrypt wygląda tak:
KOD cpp:     UKRYJ  
int start() {
   int FileHandle = FileOpen(NazwaPliku,FILE_CSV|FILE_READ|FILE_WRITE,Separator);
   if(FileHandle<1) { Print("Błąd otwarcia"); }
   else {
      FileSeek(FileHandle,0,SEEK_END);
      FileWrite(FileHandle,Bid);
      FileClose(FileHandle);
   }
   return(0);
 }
 


Zrzucany jest on jako plik *.csv. Jednak jeżeli trzeba będzie można go przerobić na plik binarny.

2. Napisałem aplikację w builderze której zadaniem jest pobieranie danych z pliku lub plików w zależności od tego ile źródeł wskażę.
Odczyt danych z pliku realizuję w timerze którego częstotliwość ustawiłem na 10 ms ( wiem, że aplikacja może tak nie chodzić )

Kod wygląda tak:
KOD cpp:     UKRYJ  
double Czytaj(FILE *pFile) {
        int Size = 0;
        double result = 0.0;
        AnsiString tmp;
        if(pFile) {
                fseek (pFile, 0, SEEK_END);
                Size = ftell(pFile);
                fseek(pFile, Size-12,SEEK_SET); // nie pamietam dlaczego zrobiłem tu 12
                fread(buffor,10,1,pFile);
                tmp = reinterpret_cast<const char*>(buffor);
                result = atof(tmp.c_str());
        }
        return result;
}
 


3. Cały mój problem polega na tym, że czasami zdarza mi się gubić dane zwłaszcza jak odczytuje dane np z 4 plików na raz. Czy może mi ktoś poradzić jak mam realizować w aplikacji Builderowskiej odczyt danych z pliku, żeby był najbardziej efektywny - przy założeniu, że mogę czytać dane od 1 źródła do 6 max. Myślałem o wątkach, może odczyt danych z wątku byłby najlepszym rozwiązaniem ??


Mam nadzieję, że wszystko jest jasne.


Dodane:

Dodam jeszcze, że skrypt uruchamia się jeżeli ma przeslać jakieś dane, otwieram i zamykam plik za każdym razem, żeby nie blokować pliku i móc z niego czytać.
Ostatnio edytowano czwartek, 20 stycznia 2011, 19:09 przez Corvis, łącznie edytowano 1 raz
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Cyfrowy Baron » czwartek, 20 stycznia 2011, 19:09

Mam nadzieję, że wszystko jest jasne.


Nie wszystko! Dlaczego do odczytu danych używasz zegara?



ały mój problem polega na tym, że czasami zdarza mi się gubić dane zwłaszcza


Skoro używasz zegara to prawdopodobnie odczyty nakładają się na siebie i dlatego gubisz dane. Powinieneś przed kolejnym cyklem-odczytem sprawdzić czy poprzedni już się zakończył.



KOD cpp:     UKRYJ  
tmp = reinterpret_cast<const char*>(buffor);


Tak nie prościej:

KOD cpp:     UKRYJ  
tmp = (AnsiString)buffor;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » czwartek, 20 stycznia 2011, 19:11

Używam zegara, bo chce mieć cały czas aktualne dane w programie napisanym w builderze, a nie wiem jak w inny sposób mam sprawdzić, czy dane w pliku się zmieniają i są aktualne. A tak miele to w zegarze i sprawdzam w programie.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Cyfrowy Baron » czwartek, 20 stycznia 2011, 19:14

a nie wiem jak w inny sposób mam sprawdzić, czy dane w pliku się zmieniają i są aktualne.


Sprawdzaj cyklicznie czy zmieniła się data modyfikacji pliku.



Czy skryptu zapisującego dane do pliku nie dałoby się napisać tak, by wysyłał do systemu jakiś komunikat? Gdyby to było możliwe program mógłby nasłuchiwać komunikatu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » czwartek, 20 stycznia 2011, 19:18

Cyfrowy Baron napisał(a):a nie wiem jak w inny sposób mam sprawdzić, czy dane w pliku się zmieniają i są aktualne.


Wydaje mi się, że kiedyś tak próbowałem robić ale tutaj w 1 sekundzie potrafi wpaść pare danych, a data modyfikacji pliku jest chyba do 1 sec ???

Cyfrowy Baron napisał(a):Czy skryptu zapisującego dane do pliku nie dałoby się napisać tak, by wysyłał do systemu jakiś komunikat? Gdyby to było możliwe program mógłby nasłuchiwać komunikatu.


Muszę sprawdzić, czy nie da sie wysłac np wciśnięcia klawisza, tylko czy jak okno programu będzie nie aktywne czy zareaguje na taki klawisz ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Cyfrowy Baron » czwartek, 20 stycznia 2011, 19:34

Muszę sprawdzić, czy nie da sie wysłac np wciśnięcia klawisza, tylko czy jak okno programu będzie nie aktywne czy zareaguje na taki klawisz ??


To wymaga przechwytywania haków systemowych. Jeżeli jednak skrypt będzie wysyłał wciśnięcie jakiejś kombinacji klawiszy, to można w programie zarejestrować taką kombinację jako gorący klawisz, wtedy obejdzie się bez montowania haków, gdyż program zawsze przechwyci gorący klawisz.

Montowanie gorącego klawisza zostało opisane w tym wątku: Uchwyt do programu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » czwartek, 20 stycznia 2011, 22:10

Wiem, że można odczytywać wciśnięte klawisze za pomocą biblioteki: IdleLib.dll i funkcji: GetLastKeyWP


Dodano:

Udało mi się wysłać klawisz skryptem:

KOD cpp:     UKRYJ  
#define VK_A   65

int start() {
   SendKey(VK_A);
   return(0);
 }
//+------------------------------------------------------------------+
void SendKey(int keycode){
   keybd_event(keycode,0,0,0);
   keybd_event(keycode,0,KEYEVENTF_KEYUP,0);
}
 
Ostatnio edytowano czwartek, 20 stycznia 2011, 22:41 przez Corvis, łącznie edytowano 1 raz
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 00:16

Baronie mam pytanie odnośnie HOTKEYów,

jeżeli rejestruje kilka:

KOD cpp:     UKRYJ  
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F1);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F2);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F3);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F4);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F5);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F6);

RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F7);
RegisterHotKey(Handle, 1, MOD_CONTROL, VK_F8);

To jak rozpoznać który przycisk został wciśnięty w funkcji:

KOD cpp:     UKRYJ  
void __fastcall TForm1::GetHotKey(TMessage &Msg) {
         if(Msg.Msg == WM_HOTKEY && Msg.WParam == TRUE) {
                // Jak się dobrać do klawisza który został wciśnięty ???
         }

         HotKey(Msg);
}
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 09:05

Doszedłem do tego,

Przy rejestracji HOTKEYA podaje jego ID jako 2 parametr funkcji potem tego id odczytać moge z Msg.WParam. Teraz dumam jak najszybciej pobrać dane z pliku.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Cyfrowy Baron » piątek, 21 stycznia 2011, 10:37

Jak rozumiem do pliku pomocy sięgasz dopiero w ostateczności, a jest tam napisane, że drugi argument funkcji RegisterHotKey to identyfikator gorącego klawisza. By uniknąć konfliktu z ID gorących klawiszy nadawanych przez system do tworzenia identyfikatora powinno używać się funkcji GlobalAddAtom.



Wiem, że można odczytywać wciśnięte klawisze za pomocą biblioteki: IdleLib.dll i funkcji: GetLastKeyWP


Nie wiem o co z tym chodzi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 11:12

KOD cpp:     UKRYJ  
String n = "id1";
int id1 = GlobalAddAtom(n.t_str());
RegisterHotKey(Handle, id1, MOD_ALT, VK_F1);    // Dane 1


Fajnie się zarejestrowało, ale teraz przestało dzialać wykrywanie HotKeya. :|

Cyfrowy Baron napisał(a): Nie wiem o co z tym chodzi.


Chodziło mi o to, że dodając tą bibliotekę do skryptu i używając tej funkcji jestem w stanie pobrać do skryptu wciskany klawisz na klawiaturze.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez polymorphism » piątek, 21 stycznia 2011, 11:16

Wtrącę się na chwilę...
KOD cpp:     UKRYJ  
AnsiString tmp;

...
       
fread(buffor,10,1,pFile);
tmp = reinterpret_cast<const char*>(buffor);
result = atof(tmp.c_str());

Po co te zabawy z AnsiStringiem, przecież to bez sensu? Szukasz optymalnych rozwiązań, a sadzisz takie babole, nie rozumiem tego... Następne pytanie, dlaczego buffor nie jest zdefiniowany wewnątrz funkcji jako zmienna lokalna?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 11:18

Taki sposób przyszedł mi do głowy tylko. Jak znasz lepszy chętnie go poznam :-)
Bufor zadeklarowałem w klasie, żeby go za każdym razem nie deklarować przy wywoływaniu funkcji.

Dodane:

Zmieniłem:

KOD cpp:     UKRYJ  
double CzytajPlik(FILE *pFile) {
        if(pFile) {
                fseek (pFile, 0,
                fseek(pFile, ftell(pFile)-12,SEEK_SET);
                fread(bufor,10,1,pFile);
        }
        return atof(bufor);
}
 
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez polymorphism » piątek, 21 stycznia 2011, 11:29

Bufor zadeklarowałem w klasie, żeby go za każdym razem nie deklarować przy wywoływaniu funkcji.

Bardzo zła metoda - nic nie daje, zwiększa wagę klasy, zmniejsza czytelność kodu.

Zmieniłem:

No, i od razu lepiej. Choć nie wiem, po co używasz do obsługi plików funkcji z C, zamiast użyć strumienia ifstream.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki odczyt z pliku- podejście numer 2

Nowy postprzez Corvis » piątek, 21 stycznia 2011, 11:33

polymorphism napisał(a): ... Choć nie wiem, po co używasz do obsługi plików funkcji z C, zamiast użyć strumienia ifstream.


Jakoś się przyzwyczaiłem do tej z C :-). Wiesz może jak problem z tymi HOTKEY rozwiązać ??


Dodane:

Trzeba było zmodyfikować warunek:

Kod: Zaznacz cały
if(Msg.Msg == WM_HOTKEY)


Ale za nic nie wiem dlaczego :-) . Api nas nie uczyli nigdy hehe
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Następna 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ł: Brak zalogowanych użytkowników i 65 gości

cron