Problem z zatrzymaniem wykonania wątku

dział ogólny

Problem z zatrzymaniem wykonania wątku

Nowy postprzez kurczez » wtorek, 19 stycznia 2010, 23:21

Mam taki oto wątek i chciałbym zatrzymać jego wykonywanie na powiedzmy 300 milisekund:

Kod: Zaznacz cały
DWORD WINAPI nSt( LPVOID lpParam )
{
   Sleep(300);
   ...
   
   return 0;
}


Kiedyś [z 10 lat temu ;)] ta funkcja działała a teraz wyświetla się błąd:


[Linker Error] Error: Unresolved external '__fastcall Idglobal::Sleep(unsigned int)' referenced from D:\DANE\SITECREATOR2\DEBUG_BUILD\UNIT2.OBJ



Wiem, że w BCB były funkcje do zatrzymania wątku, ale myślę, że sposób z Sleep jest szybszy i mnie wymagający.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zatrzymaniem wykonania wątku

Nowy postprzez Witold » środa, 20 stycznia 2010, 00:00

Spróbuj:

Kod: Zaznacz cały
::Sleep(300);
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
Podziękował : 1
Otrzymał podziękowań: 14
Kompilator: bcb6, Turbo C++ Explorer
    Windows XPOpera

Re: Problem z zatrzymaniem wykonania wątku

Nowy postprzez kurczez » środa, 20 stycznia 2010, 09:23

Dzięki działa.
Możesz jeszcze podpowiedzieć dlaczego w tym przypadku trzeba zastosować :: ?
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    Windows VistaFirefox

Re: Problem z zatrzymaniem wykonania wątku

Nowy postprzez polymorphism » środa, 20 stycznia 2010, 11:41

Chodzi o przestrzeń nazw, w tym przypadku o globalną, w której znajdują się wszystkie funkcje WinAPI. Najwidoczniej wywołujesz Sleep z wnętrza przestrzeni Idglobal, w której także znajduje się taka funkcja/metoda, z tym że liczba parametrów się nie zgadza, przez co linker nie jest wstanie znaleźć odpowiedniej wersji tej funkcji.

Zrób sobie mały test:
Kod: Zaznacz cały
void foo()
{
   cout << "global::foo\n";
}


namespace local
{
   void foo()
   {
      cout << "local::foo\n";
   }


   void test()
   {
      foo();
      ::foo();
   }
}

...

local::test(); //<--- w 'main'
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: Problem z zatrzymaniem wykonania wątku

Nowy postprzez Cyfrowy Baron » środa, 20 stycznia 2010, 11:46

Najwidoczniej wywołujesz Sleep z wnętrza przestrzeni Idglobal, w której także znajduje się taka funkcja/metoda, z tym że liczba parametrów się nie zgadza, przez co linker nie jest wstanie znaleźć odpowiedniej wersji tej funkcji.


Po umieszczeniu na formularzu dowolnego komponentu z pakietu INDY linkier ma do dyspozycji dwie funkcje o tych samych nazwach z identycznymi argumentami i nie wie której użyć, czy tej z biblioteki IdGlobal.hpp czy z winbase.h. W helpie do C++Builder 2007 jest napisane, że funkcja Sleep znajduje się w przestrzeni nazw SysUtils.
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: Problem z zatrzymaniem wykonania wątku

Nowy postprzez polymorphism » środa, 20 stycznia 2010, 11:59

Cyfrowy Baron napisał(a):[...] linkier ma do dyspozycji dwie funkcje o tych samych nazwach z identycznymi argumentami i nie wie której użyć

Tyle że wtedy miałbyś błąd kompilacji z cyklu Ambiguity between ..., a nie błąd linkera Unresolved external ... No ale to kwestia drugorzędna...
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: Problem z zatrzymaniem wykonania wątku

Nowy postprzez Cyfrowy Baron » środa, 20 stycznia 2010, 12:03

Zgadza się w C++Builder 2007 otrzymuję komunikat Ambiguity between [...], więc w Turbo C++ jest pewnie trochę inaczej. Co ciekawe w C++Builder 2010 nie otrzymuję żadnego komunikatu mimo iż pojawia się ta sama funkcja z tymi samymi argumentami w dwóch różnych bibliotekach, co wynika z helpa, a linkier używa właściwej funkcji.
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


  • 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 20 gości