Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Delay w VisualBasic 2010 Express.

adamjob 06 Mar 2012 09:46 971 3
  • #1 06 Mar 2012 09:46
    adamjob
    Poziom 8  

    Witam. W trakcie szukania portu w PC do którego podłączona jest sieć uP próbuję po kolei otworzyć istniejące w danym momencie porty COM i wysyłam przez nie pytanie, na które uP ma w odpowiedni sposób odpowiedzieć. Sprawdzam otrzymana odpowiedź i jeśli jest właściwa to wiem, że znalazłem port do którego sieć RS jest podpięta. Pomiędzy pytaniem a otrzymaniem odpowiedzi upływa pewnien czas i tu mam kłopot. Nie chcę "zamrażać" programu np na 2 sekundy korzystając z sleep a jedynie zatrzymać wykonywanie funkcji wysyłającej pytanie, potem sprawdzić co w międzyczasie doszło ( o ile cokolwiek ) i jeśli odpowiedź się nie zgadza to przejśc do kolejnego portu. Czyli chodzi mi o jakis taki odpowiednik funkcji delay czy wait. Ma może ktoś jakiś pomysł jak to zrobić ? Z funkcji podawanych przez Microsoft działa jedynie pierwsza ale opóźnienie jest minimalne, więc to nie o to chodzi. Na użycie Timera nie mam pomysłu, bowiem jak z niego wrócić do sprawdzania kolejnych portów ?

    0 3
  • #2 06 Mar 2012 10:10
    Defice
    Poziom 25  

    Zrób je w osobnych wątkach, wtedy będziesz mógł zamrozić jedynie funkcje wysyłającą pytanie.

    0
  • #3 06 Mar 2012 11:33
    adamjob
    Poziom 8  

    Defice napisał:
    Zrób je w osobnych wątkach, wtedy będziesz mógł zamrozić jedynie funkcje wysyłającą pytanie.

    A jak zamrozić jakąkolwiek funkcję ? Problem wg mnie póki co polega na tym, że jak zamrożę program to program nie zapisze sobie ramki nadsyłanej przez uP. Gdybym wiedział jak zamrozić, zatrzymać czy uśpić wykonywanie tej funkcji " szukającej " a po upływie tego czasu sprawdzić co zapisane mam w ramce odebranej z danego portu to bym nie zadawał pytania :-) Wtedy naturalnie mógłbym również zastanowić się nad robieniem tego równolegle w odrębnych wątkach czy jak im tam.

    0
  • #4 08 Mar 2012 21:54
    adamjob
    Poziom 8  

    Ponieważ nie udało się mi znaleźć działającego rozwiązania ( rozwiązanie np zliczające od 0 do 20000 kilkudziesięciokrotnie np powodowały z jakiegoś powodu co jakiś czasproblemy z zamykaniem portu COM) - zrobiłem to po swojemu. Ponieważ szukanie odpowiednika funkcji delay w VB 2010 jest dość powszechne, w skrócie opiszę jak. Dodałem Timer2 100ms z enable=false. Z pętli głównej wychodzę do SUB odczytującego najpierw jakie numery portów COM mamy do dyspozycji. Kolejne COM zapisuję w listbox, jednocześnie dodając za każdym razem 1 do zmiennej pomocniczej. Na koniec SUB gdy zmienna >0 ( czyli mamy przynajmniej 1 port COM - uruchamiam Timer2. Timer zwiększa co 100ms licznik. gdy licznik = 2 to skok do pierwszego SUB wysyłającego odpowiednią ramkę na ostatni z wykrytych portów COM. Gdy licznik = 250 to skok do drugiego SUB sprawdzającego czy otrzymaliśmy jakąś odpowiedź, a jeśli tak to porównującego ją ze wzorcem. Jeśli odpowiedź się zgadza, to zapamiętujemy numer portu i wracamy do pętli głównej. Jeśli nie, to zerujemy licznik i za chwile idziemy do pierwszego SUB. Gdy okaże się, że z żadnego portu nie wróciła poprawna odpowiedź za jakiś czas z pętli głównej programu powtarzamy całość. Naturalnie można zrobić to wielowątkowo, jeśli komuś zależy na krótkim czasie.U mnie to bez znaczenia było :-)

    0