Voici la méthode d'une classe héritée de threading.Thread. Cette méthode est appelée dans un for de la méthode run() asynchrone.

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
def _next_timestamp(self) -> Fraction:
    """Return the next timestamp to be decoded."""
    while True:
        for timestamp in sorted(set(map(Fraction, self._predictor.predict(PRED_BUFFER)))):
            print("timestamp predit", timestamp)
            if self._stop_flag:
                return StopIteration
            try:
                yield self._queues["request"].get_nowait()
                print("break")
                break  # if a new timestamp in the predictor, reset the prediction
            except queue.Empty:
                if timestamp not in self._frames:
                    print(timestamp, "n'est pas dans la queue")
                    yield timestamp
                else:
                    print(timestamp, "deja dans la queue")
        else:
            print("prediction terminee")
            yield self._queues["request"].get()
Bon, ou est le problème me diriez vous? Et bien voici ce qui se passe quand on l'appelle:

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
>>> frame_anticipator = FrameAnticipator(video, 0, {})
>>> 
>>> timestamp predit 0
                      0 n'est pas dans la queue
                                               prediction terminee
 
>>> frame_anticipator.snapshot(Fraction(0))
<av.VideoFrame, pts=0 yuv420p 1280x720 at 0x71ef653cbbe0>
>>> frame_anticipator.snapshot(Fraction(1))
<av.VideoFrame, pts=968 yuv420p 1280x720 at 0x71ef653cbc40>
>>> timestamp predit 0
                      0 deja dans la queue
                                          prediction terminee
 
>>> frame_anticipator.snapshot(Fraction(2))
<av.VideoFrame, pts=1969 yuv420p 1280x720 at 0x71ef653cb400>
>>>
Jusque-là, le comportement est tout à fait attendu. Mais voyez ce que le code continue à m'afficher à l'infini juste après :
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
timestamp predit 4
                      4 n'est pas dans la queue
                                               timestamp predit 8
                                                                 8 n'est pas dans la queue
                                                                                          timestamp predit 562949953421313/35184372088832
                   562949953421313/35184372088832 n'est pas dans la queue
                                                                         timestamp predit 4
                                                                                           4 deja dans la queue
                                                                                                               timestamp predit 8
           8 deja dans la queue
                               timestamp predit 562949953421313/35184372088832
                                                                              562949953421313/35184372088832 n'est pas dans la queue
              timestamp predit 4
                                4 deja dans la queue
                                                    timestamp predit 8
                                                                      8 deja dans la queue
                                                                                          timestamp predit 562949953421313/35184372088832
                   562949953421313/35184372088832 n'est pas dans la queue
                                                                         timestamp predit 4
                                                                                           4 deja dans la queue
...
Et cela a l'infinie !

Pourquoi diable n'entre-t-il pas dans le else du for, alors que break n'est jamais atteint !?