Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  8 907
Hei! jeg holder på å porte en Windowsapplikasjon til Linux (og OSX). På Windows bruker den Win32 threads, mens på linux bruker jeg POSIX threads. Portingen har gått ganske greit, men jeg lurer på hvordan jeg skal implementere denne funksjonen med pthreads:

Kode

		bool Wait(int timeout)

		{

			DWORD ms = timeout;

			if (timeout == -1) ms = INFINITE;

			DWORD res = WaitForSingleObject(handle, ms);

			if (res == WAIT_OBJECT_0) return true;

			else return false;



		}
Noen forslag?

Okei, kanskje det er enklere hvis jeg forklarer hva den funksjoen skal gjøre. Det er en funksjon som er medlem av thread-klassen vår, og når den er kallt skal den vente i timout antall millisekund for at denne threaden (med handelen handle) skal kjøre ferdig.
tilsvarende er kanskje Join ?
TheGEEK: ja, tror du er inne på noe der, men hvordan skal jeg få den til å bare prøve i et visst antall ms?

Funksjonen skal returne true hvis threaden rekker å kjøre ferdig. Følgende står i dokumentasjonen:

Kode

		/**
			Waits for the thread to terminate.
			The calling thread waits for the thread to terminate for the given number of milliseconds.
			If the thread does not terminate in time, the function returns false. If it terminates in time,
			the function returns true. Setting timeout to -1 will wait for infinity.
			@param timeout The maximum time to wait, in milliseconds, or -1 for infinity.
			@return True if the thread terminated in time, false if the waiting timed out.
		*/
Sist endret av TheInternet; 26. november 2007 kl. 22:46.
▼ ... noen måneder senere ... ▼
Jeg tror jeg er ganske nær en løsning nå.

Kode

 
bool Wait(int timeout)
{
    if (timeout == -1)
    {
        if (pthread_join(thread, &status)==0) return true;
    }
    else
    {
        int stat;

        for (int i = 0; i< timeout; i++)
        {
            waitpid(thread, &stat, 0); // problemet nå er at thread er en pthread_t, men jeg trenger prosess id'n (pid_t) til threaden
            if (WIFEXITED(stat))
                return true;
            else
                sleep(1);
        }
    }
    return false;
}
Problemet er å få prosess id'n til en tråd uten å være inni tråden selv.

Noen forslag?
Sist endret av TheInternet; 21. februar 2008 kl. 15:09.
Er ikke sikker på hvorfor du vil blande prosesser (waitpid) inn i dette?

Funksjonen jeg tror du egentlig leter etter er: pthread_timedjoin_np()
Som er slik som pthread_join() bare med en timeout som du kan spesifisere.

Merk at du må ha GNU extensions i pthread-biblioteket for å bruke pthread_timedjoin_np()
Tror ikke det funker å bruke pthread_join slik (skyt meg hvis jeg tar feil)..
The calling thread waits for the thread to terminate for the given number of milliseconds.
If the thread does not terminate in time, the function returns false
Vis hele sitatet...
Slik du bruker den her:
if (pthread_join(thread, &status)==0) return true;
Vis hele sitatet...
Kommer den til å vente "uendelig", til threaden er ferdig. Hvis den ikke skulle returnere 0 vil det ikke være noe mening i å fortsette å vente(for løkken med waitpid).

Fra pthread_join manpagen:
ERRORS
The pthread_join() function shall fail if:

EINVAL The implementation has detected that the value specified by
thread does not refer to a joinable thread.

ESRCH No thread could be found corresponding to that specified by the
given thread ID.


The pthread_join() function may fail if:

EDEADLK
A deadlock was detected or the value of thread specifies the
calling thread.
Vis hele sitatet...
Fordi hvis den ikke returnerer 0, er det enten ikke en joinable thread, finner ingen thread med den id'en, eller så er det en deadlock; at de to threadene venter på hverandre.
Sist endret av dword; 24. februar 2008 kl. 06:25.
Sitat av dword
Kommer den til å vente "uendelig", til threaden er ferdig. Hvis den ikke skulle returnere 0 vil det ikke være noe mening i å fortsette å vente(for løkken med waitpid).

Fordi hvis den ikke returnerer 0, er det enten ikke en joinable thread, finner ingen thread med den id'en, eller så er det en deadlock; at de to threadene venter på hverandre.
Vis hele sitatet...
Hvis (timeout == -1) skal den vente for alltid på threaden, og feile bare hvis threaden ikke eksisterer, ikke er joinable, eller noe annet rart. Hvis timeout ikke er -1 skal den vente så lenge som spesifisert, og feile hvis ikke threaden avsluttet innen da.

Jeg tror jeg har klart å gå rundt problemet med å finne pid til en thread man ikke er i selv ved å "wrappe" funksjonen som skal kjøres slik at jeg kan hente ut pid-en før den egentlig funksjonen kjøres. jeg har også endret funksjonen litt, men den fungerer ikke helt enda:

Kode

		bool Wait(int timeout)

		{
			if (timeout == -1)
			{
				if (pthread_join(thread, &status)==0) return true;
			}
			else
			{
				const float startTime = GetTime();
				while(GetTime()-startTime<=timeout)
				{
					waitpid(thread_pid, &stat, 0);
					if (WIFEXITED(stat)) return true;
				}
			}
			return false;
		}
Jeg tror det er pthread_timedjoin_np() jeg egentlig leter etter jeg også. Skal se på den funksjonen, tusen takk!
Det ser ut som pthread_timedjoin_np løste problemet med wait()-funksjonen. Tusen takk rkruger! Nå, er det noen som har forslag til hvordan jeg skal implementere Suspend() og Resume() med det samme?
Sitat av TheInternet
Hvis (timeout == -1) skal den vente for alltid på threaden, og feile bare hvis threaden ikke eksisterer, ikke er joinable, eller noe annet rart. Hvis timeout ikke er -1 skal den vente så lenge som spesifisert, og feile hvis ikke threaden avsluttet innen da.
Vis hele sitatet...
Ser det nå, jeg leste koden din helt feil, mulig det var litt for sent/tidlig for meg til å sjekke kode :>