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

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

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

Pomysł z hotkey'em wydaje mi się... yyy, prowizoryczny. Jeśli dobrze rozumiem problem, to jest typowy przypadek, gdzie trzeba zastosować synchronizację. Choć muszę zadać pytanie pomocnicze: czy ten skrypt za każdym razem generuje plik o tej samej nazwie, czy nazwa się zmienia?
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 Cyfrowy Baron » piątek, 21 stycznia 2011, 11:46

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


To działa, le identyfikator klawisza nie może mieć zasięgu lokalnego, przecież musisz go wykrywać w funkcji przechwytującej komunikat o wciśnięciu gorącego klawisza:

plik źródłowy Unit1.h
KOD cpp:     UKRYJ  
private:        // User declarations
        int id1, id2, id3, id4;
        TWndMethod HotKey;
        void __fastcall GetHotKey(TMessage &Msg);


plik nagłówkowy Unit1.cpp
KOD cpp:     UKRYJ  
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 String n = "#id1";
 id1 = GlobalAddAtom(n.t_str());
 RegisterHotKey(Handle, id1, MOD_ALT, VK_F1);

 HotKey = this->WindowProc;
 this->WindowProc = GetHotKey;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetHotKey(TMessage &Msg)
{
 if(Msg.Msg == WM_HOTKEY && Msg.WParam == id1)
 {
  /* jakaś operacja */
 }

 HotKey(Msg);
}


Szkoda tylko, że dla wielu identyfikatorów nie da się użyć metody switch-case, gdyż case wymaga parametru typu constant. Pisanie wielu warunków byłoby kiepskim pomysłem, więc może wektory.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
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:46

Nazwa się nigdy nie zmienia, dane do pliku są dopisywane zawsze na jego końcu.


Dodane:

Dzięki baronie :)
"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, 11:49

Pomysł z hotkey'em wydaje mi się... yyy, prowizoryczny.


Też tak uważam, ale Corvis udziela niepełnych informacji. Istotne jest np. pytanie: co lub kto uruchamia skrypt, czy jest on uruchamiany na tym samym komputerze, który odczytuje pliki? Jeżeli tak, to można by napisać program, który uruchamia skrypt i wysyła informacje do programu odczytującego plik o tym, że plik został utworzony i należy pobrać z niego dane.

Wąskim gardłem tego programu jest ten skrypt.
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:52

1. Co lub kto uruchamia skrypt - ja działa to na platformie XTB
2. Czy jest on uruchamiany na tym samym komputerze, który odczytuje pliki? - tak to ten sam komputer.


Tylko, że jedynym sposobem otrzymania danych jest chyba skrypt, albo DDE. ale dde to już sprawdziłem działa za wolno.
"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:53

Wąskim gardłem tego programu jest ten skrypt.

Wąskim gardłem jest metoda komunikacji między programami, z dość kulawą synchronizacją.
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 Cyfrowy Baron » piątek, 21 stycznia 2011, 11:56

Corvis napisał(a):Nazwa się nigdy nie zmienia, dane do pliku są dopisywane zawsze na jego końcu.


Skoro dane są dopisywane do tego samego pliku, to znaczy, że zmienia się za każdym razem rozmiar pliku, więc wystarczy cyklicznie sprawdzać, czy zmienił się rozmiar pliku i jeżeli tak to dopiero wtedy pobrać dane.



polymorphism napisał(a):Wąskim gardłem jest metoda komunikacji między programami, z dość kulawą synchronizacją.


Tutaj w zasadzie jest tylko skrypt i program, więc trudno mówić o komunikacji między programami, chyba że chodzi Tobie o program przetwarzający skrypt.
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 Cyfrowy Baron » piątek, 21 stycznia 2011, 11:59

Corvis napisał(a):1. Co lub kto uruchamia skrypt - ja działa to na platformie XTB


Co to znaczy ja działa to na platformie XTB ? Rozwiń tą myśl, gdyż nie rozumiem. To jakiś program?
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 polymorphism » piątek, 21 stycznia 2011, 12:02

chyba że chodzi Tobie o program przetwarzający skrypt.

No, to oczywiste ;)

Z tego co widzę, w MQL-u można użyć socketów, może w tę stronę uderzyć?
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, 12:02

http://www.xtb.pl/?p=46

To jest platforma transakcyjna
"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, 13:04

Czas zacząć czytać o socketach :-)
"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, 14:59

polymorphism gdzie ty przeczytałeś, o tych socketach w mql ??
"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, 15:10

Nie mów mi, że nic nie znalazłeś :D

http://codebase.mql4.com/6831
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, 15:16

To znalazłem ale ta biblioteka zeromq mi coś nie działa, tera spróbuje z tymi plikami co sa tutaj.

Myślałem, że w dokumentacji MQL znalazłeś coś o tym.
"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, 16:11

Jako, że nie mam doświadczenia w pisaniu aplikacji sieciowych, mam pytanie.

Udało mi się uruchomić biblioteki i programy z postu który dostałem. Problem jest taki, że wydaje mi się, że dużo kodu wykonuje się zbędnie.

Skrypt w Mql można poddzielić tak:

1. Sekcja init - uruchamiana przy starcie skryptu
2. Sekcja Start - uruchamiana jak zmienią sie dane
3. Sekcja Deinit - uruchamiana na koniec skryptu

Mam kod skryptu:

KOD cpp:     UKRYJ  
#include <winsock.mqh>

#import "user32.dll"
bool GetAsyncKeyState(int Key);
#import
 
#define DEFAULT_PORT 2007
#property show_inputs
extern string protocol="TCP";
extern int port=DEFAULT_PORT;
extern string server_addr="127.0.0.1";
extern int maxloop=-1;


bool isalpha(int c) {
  string t="0123456789";
  return(StringFind(t,CharToStr(c))<0);
 
}

void Usage() {
    Print("\t- The defaults are TCP, 2007, localhost");
    Print("\t- Hit ESC to terminate client script...");
    Print("\t- maxloop is the number of loops to execute 0=endless.");
    Print("\t- server_ip is the IP address of server");
    Print("\t- port is the port to listen on");
    Print("Where:\n\t- protocol is one of TCP or UDP");
    Print("Usage: protocol port server iterations");
}
int conn_socket=0;
int  start() {
    int Buffer[32];
    int retval;
    int i, loopcount=0;
    int addr[1];
    int socket_type;
    int server[sockaddr_in];
    int hp;
    int wsaData[WSADATA];
 
     if (protocol=="TCP")
      socket_type = SOCK_STREAM;
    else if (protocol=="UDP")
      socket_type = SOCK_DGRAM;
    else {
      Usage();
      return(-1);
    }    
    if (port==0) {
      Usage();
      return(-1);
    }    
    retval = WSAStartup(0x202, wsaData);
    if (retval != 0) {
       Print("Client: WSAStartup() failed with error "+ retval);
       return(-1);
    } else
       Print("Client: WSAStartup() is OK.");
 
    if (isalpha(StringGetChar(server_addr,0))){
        Print("Client: IP address should be given in numeric form in this version.");
        return(-1);
    } else {
        addr[0] = inet_addr(server_addr);
        hp = addr[0];
        //hp = gethostbyaddr(addr, 4, AF_INET);
        Print("server addr:"+addr[0]+" hp"+hp);
    }
    if (hp == 0 ) {
       Print("Client: Cannot resolve address \""+server_addr+"\": Error :"+WSAGetLastError());
       return(-1);
    }
   
    int2struct(server,sin_addr,addr[0]);
    int2struct(server,sin_family,AF_INET);
    int2struct(server,sin_port,htons(port));
 
    conn_socket = socket(AF_INET, socket_type, 0);
    if (conn_socket <0 ) {
        Print("Client: Error Opening socket: Error "+ WSAGetLastError());
        return(-1);
    } else
       Print("Client: socket() is OK.");
 
    Print("Client: Client connecting to: "+ server_addr);
    retval=connect(conn_socket, server, ArraySize(server)<<2);
    if (retval == SOCKET_ERROR) {
        Print("Client: connect() failed: ", WSAGetLastError());
        return(-1);
    }
    else
       Print("Client: connect() is OK.");
    string m = Bid;
    while(!IsStopped()) {
      str2struct(Buffer,ArraySize(Buffer)<<18,m);
      retval = send(conn_socket, Buffer, ArraySize(Buffer)<<2, 0);
      if (retval == SOCKET_ERROR) {
         Print("Client: send() failed: error ", WSAGetLastError());
         return(-1);
      } else
          Print("Client: send() is OK.");
      Print("Client: Sent data "+ struct2str(Buffer,ArraySize(Buffer)<<18));
 
      retval = recv(conn_socket, Buffer, ArraySize(Buffer)<<2, 0);
      if (retval == SOCKET_ERROR) {
         Print("Client: recv() failed: error ", WSAGetLastError());
         return(-1);
      } else
        Print("Client: recv() is OK.");
       
      if (retval == 0) {
        Print("Client: Server closed connection.");
        return(-1);
      }
 
      Print("Client: Received "+retval+" bytes, data \""+struct2str(Buffer,ArraySize(Buffer)<<18)+"\" from server.", retval, Buffer);
      loopcount++;
      if (maxloop<0) break;
      if ((loopcount >= maxloop) && (maxloop >0))
         break;
      Sleep(1100);
      if(GetAsyncKeyState(27)) break;
    }
    return(0);
}

int deinit() {
  if (conn_socket>0) closesocket(conn_socket);
  WSACleanup();
}

 



Wszystko jest wrąbane w sekcje start - łączenie za każdym razem i inne głupoty których jeszcze nie rozmumiem. Chce to podzielić na te sekcje, że łącze się raz jak uruchamiam skrypt, w starcie wysyłam dane, na końcu rozłączam ( przy wyjściu z programu )

Może ktoś ma jakieś pomysły jak to przerobić ?? Jeżeli nie to prędzej czy później sam dojdę, ale może ktoś ma doświadczenie w pisaniu takich aplikacji.


Pozdrawiam i dzięki wszystkim za pomoc
"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

Poprzednia stronaNastę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 9 gości

cron