logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

C# - Program różnie się wykonuje na win 7 i win xp

IXOF 08 Gru 2014 09:06 1689 25
REKLAMA
  • #1 14202280
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Witam. Chciałem spytać, czy jest możliwa sytuacja, że program różnie działa w zależności od systemu. Na win 7 działa poprawnie, natomiast na XP postawionym na virtualBox nie. Program do działania potrzebuje .net framework4.0 i pisałem go w visual studio.
    Program na win 7 działa tak, że po uruchomieniu klikam odtwarzaj "button2" i po wkrótce uruchamia się nowy wątek z nieskończoną pętlą, a ten uruchamia kolejny w którym startuje funkcja odpowiedzialna na dźwięk. No i gdy ten ostatni wątek kończy działanie (koniec piosenki), to jeżeli godzina nadal jest ok startuje następna. Na xp wygląda to tak, że klikam odtwarzaj. Piosenki poleci trochę i następna. I to nie jest tak, że okres czasu jest ten sam. Jedna leci 5s, inna 15, inna 30 i nie wiem gdzie szukać problemu. Oto kod programu:

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 14203952
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Czy to jest tak, że na Win7 wykonanie metody Start do start_muzyka wstrzymuje dalsze wykonanie a na XP nie? Bo z opisu by tak wynikało. Ale znacznie lepiej byłoby zdebugować program i zweryfikować, jaka i gdzie jest różnica.

    Mogło być tak, że zmieniły się np. domyślne parametry obiektów.
  • #3 14204029
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Dżyszla napisał:
    Czy to jest tak, że na Win7 wykonanie metody Start do start_muzyka wstrzymuje dalsze wykonanie a na XP nie? Bo z opisu by tak wynikało.


    Raczej nie ponieważ wykonanie tej metody na win7 nie zatrzymuje programu(?) tylko otwiera nowy wątek, a ten w którym jest wywołana cały czas pracuje i sprawdza czy owy wątek żyje. To bardziej wygląda tak, że ten nowy wątek w którym jest wywołane PlaySync() z jakiegoś powodu się przerywa. Zdebugować na win7 ? czy zainstalować visual na xp ? Oby pierwsza opcja, bo drugiej się boje.

    Debugger w visual studio 2013 nic nie pokazuje ;(
  • #4 14204206
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Myślę, że wykonanie krokowe ale dla tego wątku, co ma odtwarzać (nie cały program). W zasadzie i tu i tu byłoby najlepiej. Czy IsAlive zwraca poprawnie wynik. Czy PlaySync rzeczywiście nie puszcza dalej kodu aż do zakończenia.
  • REKLAMA
  • #5 14204241
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    A możesz podpowiedzieć czym mogę to zrobić ? :D Bo dostępne visuale mają w wymaganiach win vista/7 i w góre :/
  • #7 14207448
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Na tą chwilę wiem, że to nie wina wirtuala, ponieważ na fizycznym systemie objawy są takie same. Czy ktoś jeszcze ma jakieś pomysły ?
    Zależy mi, żeby naprawić ten program .
  • Pomocny post
    #8 14207503
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    Dodaj Memo i loguj w glownych punktach.
  • #9 14207554
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    A co to jest to MEMO ? Rzucałem hasło w google, ale nic nie wyczytałem co bym zrozumiał :D

    I tak a pro po, to czy wgl jest możliwe, że inny system inaczej interpretował kod programu ? Przecież chyba kompilacja na przetłumaczeniu kodu na kod maszynowy, czyli ten dla procesora (?) Więc dlaczego jest to inaczej interpretowane ?
  • Pomocny post
    #10 14208366
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    TMemo is a wrapper for a Windows multiline edit control.
    Niewiem jak nazyw się kontrolka w C#.
  • Pomocny post
    #11 14209428
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    IXOF napisał:
    czy wgl jest możliwe, że inny system inaczej interpretował kod programu ?
    Jest możliwe. Ponieważ nie piszesz programu, który byłby autonomiczną aplikacją, ale korzystasz (choć nie zdajesz sobie z tego sprawy) z ogromu funkcji systemowych. Na .NET jeszcze jedna warstwa dochodzi, czyli jeszcze bardziej może się różnić działanie.

    Pomiędzy XP a Vista i późniejszymi zaszły bardzo istotne i bardzo wiele zmian w systemie. Np. sposób ładowania bibliotek bez podanej ścieżki dostępu, cała masa rzeczy związana z uprawnieniami (w tym dostęp do rejestru systemowego). Dodatkowo podsystem WoW (Windows on Windows) jest trochę wirtualnym środowiskiem - na XP po prostu nie było go, bo system był 32-bitowy. Jeśli aplikację 32-bitową odpalasz na systemie 64-bitowym, to w rzeczywistości dostarczane jest aplikacji środowisko WoW (inne ścieżki widzi aplikacja, inne są w rzeczywistości, to samo z rejestrem). No chyba, że kompilujesz od razu do Win64, ale takie zmiany także bardzo często wymagają uwagi programisty.
  • REKLAMA
  • Pomocny post
    #12 14211573
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    Usuń to
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    i używaj Invoke tam, gdzie odwołujesz się do kontrolki z innego wątku niż główny.

    Kod: C#
    Zaloguj się, aby zobaczyć kod
    Chyba nie muszę tłumaczyć, co tu jest nie tak? ;)

    Kod: C#
    Zaloguj się, aby zobaczyć kod
    Nie dodałeś, że w UTF-8 (choć to można bardzo łatwo zmienić) i w jakim formacie muszą być pliki wejściowe. Poza tym nie w folderze programu tylko w folderze roboczym.

    Nazywaj przyciski. Masz w designerze właściwość (Name).

    Taki długi warunek powinien być jeden.

    Dżyszla napisał:
    Dodatkowo podsystem WoW (Windows on Windows) jest trochę wirtualnym środowiskiem - na XP po prostu nie było go, bo system był 32-bitowy.
    Z tego co mi wiadomo był i 64-bitowa wersja systemu pozwala uruchamiać 32-bitowe programy, a 32-bitowa - 16-bitowe.
  • #13 14213092
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Znam to invoke - gdy debuger zaczął mi właśnie wywoływać wyjątek z tym związany próbowałem go użyć, ale nie umiałem, więc skończyłem na tym zapisie.

    Drugi cytat - nie, nie musisz, szczerze mówiąc już na forum kiedyś mi ktoś to mówił i sam nie wiem jak to się stało, że to się tu znalazło.

    Co do plików - too nie rozumiem. Jak to nie podałem w jakim formacie muszą być pliki wejściowe ? .txt to nie to ? o jakie formaty chodzi ?
    Co do folderu programu - chodzi mi o ten folder gdzie znajduję się plik .exe. Jaka jest różnica między folderem programu, a folderem roboczym ?

    I "tak długi warunek powinien być jeden".

    Chodzi o warunek gdzie sprawdzam godzinę ? Jeżeli tak, to dlaczego tylko jeden ? jakie jest ograniczenie ? I jeżeli ma być tylko jeden, to powinienem to rozbić na 3 zagnieżdżone warunki, czy tak ?

    Dzięki za odpowiedź!
  • #14 14213347
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    LED5W napisał:
    Z tego co mi wiadomo był i 64-bitowa wersja systemu pozwala uruchamiać 32-bitowe programy, a 32-bitowa - 16-bitowe.
    Owszem, pozwala. Ale nie jest to do końca natywny system, lecz pewna "wirtualizacja". Obrazem może być to, że aplikacje 32-bitowe nie mają dostępu do wszystkich elementów systemu, a to co widzą w rejestrze czy katalogach w rzeczywistości znajduje się w innym miejscu.
  • REKLAMA
  • Pomocny post
    #15 14213669
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    IXOF napisał:
    Znam to invoke - gdy debuger zaczął mi właśnie wywoływać wyjątek z tym związany próbowałem go użyć, ale nie umiałem, więc skończyłem na tym zapisie.
    Chyba najlepiej podać przykład.
    Kod: C#
    Zaloguj się, aby zobaczyć kod


    IXOF napisał:
    Co do plików - too nie rozumiem. Jak to nie podałem w jakim formacie muszą być pliki wejściowe ? .txt to nie to ? o jakie formaty chodzi ?
    Spróbuj w swoim pliku log podać plik np. z polskim "ogonkiem". Pliki o rozszerzeniu .txt mogą być zapisywane w różnych formatach. Patrz na kodowanie podczas zapisu. Na początku takiego pliku może znajdować się znacznik BOM.

    IXOF napisał:
    Co do folderu programu - chodzi mi o ten folder gdzie znajduję się plik .exe. Jaka jest różnica między folderem programu, a folderem roboczym ?
    Katalog roboczy można ustawić niezależnie od lokalizacji pliku wykonywalnego. Polecam zabawę w Wierszu polecenia.

    IXOF napisał:
    I "tak długi warunek powinien być jeden".

    Chodzi o warunek gdzie sprawdzam godzinę ? Jeżeli tak, to dlaczego tylko jeden ? jakie jest ograniczenie ? I jeżeli ma być tylko jeden, to powinienem to rozbić na 3 zagnieżdżone warunki, czy tak ?
    Tak. Chodzi o to, że przy takich warunkach łatwo się pomylić przy zmianach. Poza tym po co sprawdzać coś dwa razy.

    Stosuj camelCase. Nie stosuj spacji przed pytajnikiem (w zwykłym tekście).
  • #16 14237811
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Witam ponownie.. Nic nie wskurałem. Nadal nie rozumiem tego invoke, ale próbowałem poczytać, ale wiele to nie dało. Ale stwierdziłem, że jeżeli to invoke mam użyć wtedy, gdy odwołuje się do kontrolki w wątku innym niż główny to.. przestanę się odwoływać :D
    Wykomentowałem te miejsca, gdzie odnoszę się do kontrolek. Jest to tylko komponent label "wpisz_haslo" w którym wyświetlam (a raczej wyświetlałem) obecną piosenkę. No ale program nadal na xp jest nieokiełznany :/

    Tu kod w razie czego, może czegoś zapomniałem wy komentować ?

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #17 14240718
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    Wrzuć spakowany cały projekt to go sprawdzę na XP.
  • #18 14241082
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    W pliku log powinny znajdować się nazwy piosenek w formacie .wav ;)
    Załączniki:
    • WindowsFormsApplication2.rar (146.43 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #19 14241423
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    IXOF napisał:
    Nic nie wskurałem. Nadal nie rozumiem tego invoke, ale próbowałem poczytać, ale wiele to nie dało.
    Tzn. konkretnie czego nie rozumiesz?

    Znalazłem jeden przypadek podobnego problemu, niestety bez rozwiązania.
    Najprawdopodobniej odtwarzanie przerywa sama metoda PlaySync.

    Do odtwarzania muzyki lepiej wykorzystać choćby kontrolkę Windows Media Player. Można ją ukryć i sterować programowo.
  • #20 14241538
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    Skompilowałem za pomocą C# 2008.
    Odremowałem Control.CheckForIllegalCrossThreadCalls = false; (Exceptiony)
    Zaremowałem wykrywanie czasu.
    I u mnie działa (XP Profesional 32bit SP3).
    PS. Gdybyś skompilował z takimi samymi zmianami i wrzucił sam EXE to bym moge sprawdzić.
  • Pomocny post
    #21 14242174
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    Jeżeli chciałbyś spróbować z Windows Media Player, to taki uproszczony projekt masz w załączniku. Podstawowe operacje odtwarzania + zapis / wczytanie listy piosenek do / z pliku. Katalog i ścieżki ustawione na sztywno na początku kodu. Bez wielu wątków - odtwarzacz sam sobie tym zarządza. Testowane tylko na Win7, więc nie wiem jak się zachowa na XP - może być ten sam problem.
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • Odtwarzacz.zip (277.69 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #22 14242231
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    LED5W napisał:
    Tzn. konkretnie czego nie rozumiesz?
    ...
    Do odtwarzania muzyki lepiej wykorzystać choćby kontrolkę Windows Media Player. Można ją ukryć i sterować programowo.


    Nie wiem jak to invoke ma się do mojego kodu, gdzie to wstawić, co powstawiać w "jakaśMetoda", kompletnie nie wiem jak to ugryźć ;/

    Do do mediaplayer, kiedyś próbowałem, ale działało mi to tylko wtedy , gdy na sztywno w kod podałeś ścieżki do piosenek, i trochę mnie to drażniło i odpuściłem, gdy zobaczyłem metodę playsound() i coś podobnego w c#.




    Zaremować i odzerować tzn zakomentować i odkomentować ? :D

    Jeżeli tak, tu skompilowany plik. U mnie nie działa..

    Ps. zaremowane wykrywanie czasu, to masz na myśli, tylko te dwa if'y ? Bo właśnie tam zaremowałem sprawdzanie czasu.



    EDIT: Pamiętam, że kiedyś znalazłem info, jak uruchomić funkcje właśnie z c++, owe playsound(). Myślicie, że zaadoptowanie jej, i wyrzucenie obiektu SoundPlayer może pomóc ? Bo nie wiem, czy jest sens zabawy z tym.
    Załączniki:
    • Radio_w__ze__.exe (15 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #23 14242296
    marcinj12
    Poziom 40  
    Posty: 3404
    Pomógł: 1024
    Ocena: 250
    IXOF napisał:
    Do do mediaplayer, kiedyś próbowałem, ale działało mi to tylko wtedy , gdy na sztywno w kod podałeś ścieżki do piosenek
    Jeżeli coś działa ze ścieżką podaną na sztywno, to zwykle można to przerobić tak, żeby ścieżkę brało ze zmiennej. Pewnie coś źle zrobiłeś - w przykładzie ode mnie masz pobieranie ścieżek "dynamicznie".

    SoundPlayer ma dwie zasadnicze wady w stosunku do Windows Media Player - jest baaaardzo uproszczony i ubogi w opcje i można nim odtwarzać tylko pliki .wav - nie obsłuży np. mp3, co na dzień dobry dyskwalifikuje go w jakiś większych zastosowaniach typu własny odtwarzacz.
  • #24 14242327
    witoldwitoldowicz
    Poziom 28  
    Posty: 698
    Pomógł: 163
    Ocena: 60
    Niestety sprawdziłem jeszcze raz i okazało się że mój też nie działa (zmienia po kilku minutach).
  • #25 14242831
    IXOF
    Poziom 18  
    Posty: 396
    Pomógł: 10
    Ocena: 25
    Playsound() wstawione wg tego poradnika również nie działa :/

    http://msdn.microsoft.com/pl-pl/library/ms173187.aspx


    Spróbuje nie tworzyć wątku "ręcznie" tylko użyje komponentu BackgroundWorker

    Dodano po 43 [minuty]:

    LED5W napisał:

    Najprawdopodobniej odtwarzanie przerywa sama metoda PlaySync.




    Chyba masz racje kolego. Jestem tego prawie pewny, ponieważ próbowałem na wszelkie sposoby to zrobić. Dodałem nowy backgroundworker, tam wykonywałem soundplayer i funkcje playsound. Wszystko z parametrem sync. Nic. A teraz mnie olśniło i dałem tą funkcje playsound() do bacgroundworker1, czyli do tego pierwszego wątku, i teraz jest to pewne, że samo playsync nie działa, bo wątek nie prawa ruszyć dalej, dopóki funkcja się nie wykona.

    Eh.. spróbuje z mediaplayer, chyba, że ktoś ma jeszcze pomysły ?



    Jeżeli ktoś coś, to tu jest kod programu :

    Kod: C#
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #26 14243961
    LED5W
    Poziom 34  
    Posty: 2302
    Pomógł: 264
    Ocena: 162
    IXOF napisał:
    Nie wiem jak to invoke ma się do mojego kodu, gdzie to wstawić, co powstawiać w "jakaśMetoda", kompletnie nie wiem jak to ugryźć ;/
    Potrzebujesz Invoke, bo ta metoda umożliwia wykonanie kodu w wątku w którym działa dana kontrolka.
    Podałem dwie wersje:
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    W pierwszej musisz stworzyć metodę do której przeniesiesz fragment kodu, który odwołuje się do kontrolki. Zamiast jakaśMetoda wstawiasz nazwę tej metody. W przykładzie, który podałem musi to być taka metoda
    Kod: C#
    Zaloguj się, aby zobaczyć kod
    Zwróć uwagę na delegat Action<T> i szczególnie na to jakie parametry przekażesz w tablicy obiektów (muszą mieć typ zgodny z parametrami delegata).
    Druga wersja nie wymaga tworzenia oddzielnej metody - zawiera tzw. metodę anonimową (nieposiadającą nazwy). Jej kod umieszczasz w miejscu komentarza. Tutaj możesz używać zmiennych zadeklarowanych w metodzie wywołującej Invoke.

Podsumowanie tematu

✨ Użytkownik zgłasza problem z działaniem programu napisanego w C# na systemach Windows 7 i Windows XP, gdzie program działa poprawnie na Win 7, ale na XP występują nieprawidłowości w odtwarzaniu dźwięku. Program wymaga .NET Framework 4.0 i korzysta z wielowątkowości do odtwarzania muzyki. Użytkownicy sugerują debugowanie, sprawdzenie działania metod PlaySync oraz użycie kontrolki Windows Media Player zamiast SoundPlayer. Wskazano również na różnice w interpretacji kodu przez różne wersje systemu Windows oraz na problemy z dostępem do zasobów systemowych. Użytkownik rozważa użycie BackgroundWorker oraz zdalnego debugowania, ale napotyka trudności w implementacji.
Wygenerowane przez model językowy.
REKLAMA