Bonjour,
j'ai un problème à propos de mémoire partagée+thread, voilà le contexte:
depuis un client A j'envoie un message;
le client B reçoit le message
le client B envoie un ACK correspondant au message reçu;
le client A reçoit l'ACK correspondant au message qu'il vient d'envoyer et envoie un nouveau message.

Mon problème se situe lors de la réception de l'ACK par le client A (l'émetteur du message d'origine). En effet, je ne dois envoyer le prochain paquet qu'à 2 conditions:
_ l'ACK que je viens de recevoir correspond bien au message que je viens d'envoyer;
ET
_ j'ai reçu l'ACK du message avant 100ms (dépassé ce délai, le message d'origine est tout simplement renvoyé).
La première condition est triviale, mais la seconde l'est beaucoup moins.
J'ai testé 2 pistes qui me semblent les plus adéquates:
_ utiliser la classe Timer avec son schedule(TimerTask, long)
_ utiliser les threads (mais là j'avoue avoir quelques difficultés alors que je crois que ma solution en est étroitement liée)

Voici mon code pour l'instant (utilisant la notion de thread):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package communication.system;
 
//Add-ons packages
import communication.main.Message;
 
//Exceptions packages
import java.io.FileNotFoundException;
import java.io.IOException;
 
/**
 * This class will wait all acknowledgements of each packet sent
 * 
 * @version 8.0, 24/11/07
 * @since   version 1.0
 *
 */
public class WaitForAcknowledgement extends Thread {
	/**
         * This method will wait while an ACK isn't received
         * @return true if ID acknowledgement received is the same that ID packet sent 
         */
 
	private static Integer integer = -1;
	private static Message messageMessage;
 
	/**
         * Constructor
         * @param message
         */
	WaitForAcknowledgement (Message message) {
		messageMessage = message;
	}// WaitForAcknowledgement (Message)
 
	/**
         * Method who will wait each ACK
         * @param id the last packet Id
         * @param message This object Message is used only to get network parameter
         * @return a boolean: TRUE if Id ack packet and Id data packet is same, otherwise FALSE
         * @throws FileNotFoundException
         * @throws IOException
         * @throws InterruptedException
         */
	public static boolean waitForAck(int id, Message message)
	throws FileNotFoundException, IOException, InterruptedException {		
 
		//create my thread calling WaitForAcknowledgement class constructor
		Thread T = new WaitForAcknowledgement(message);
 
		//Waits at most 100 milliseconds for this thread to die. A timeout of 0 means to wait forever.
		T.join(100);
 
		//start my thread
		T.start();
 
		while(T.isAlive());
 
		//if I received my ACK, return TRUE else FALSE
		if(id==integer.intValue()) return true;
		else return false;		
	} //waitForACK()
 
	/**
         * This method is used by the thread
         */
	public void run() {
		 try {
			 integer = (Integer)PacketsReceptor.packetReceived(messageMessage);
			 interrupt();
		 }
		 catch(FileNotFoundException fnfe) {System.out.println(fnfe);}
		 catch(IOException ioe) {System.out.println(ioe);}
		 catch(InterruptedException ie) {System.out.println(ie);}
	}// run()
}// Class WaitForAcknowledgement
P.S. ne faites attention à mon anglais qui est des plus limité