Salut,

Je vous propose un nouvel élément à utiliser :
Unité BGPH (Background Procedures Handler)
Gestionnaire de procédures appellées à intervalles réguliers (procédures d'arrière-plan).
Fichiers :
  • BGPH.PAS
    L'unité contenant toutes les déclarations des procédures/fonctions externes gérant la procédure d'arrière plan.

  • BGPH.ASM
    Contient le code des procédures/fonctions utilisés par l'unité BGPH.PAS.

  • BGPH.OBJ
    Résultat de la compilation du fichier BGPH.ASM utilisé par l'unité BGPH.PAS.


Exemple de code :
  • BGPDEMO.PAS
    Simple démonstration des procédures et fonctions de géstion de procédures appelées à intervalles réguliers.


Développé à l'aide de :
  • Turbo Pascal 7.0
  • Turbo Assembler 4.0

de Borland International, Inc.


Code source de l'unité
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
{***********************************************************************}
{									}
{	BGPH (BackGround Procedures Handler)				}
{									}
{	Géstionnaire de procédures appellées à intervalles réguliers	}
{	(procédures d'arrière-plan)					}
{									}
{	Auteur 	: Eric GARIDACCI					}
{									}
{	Date	: 24.11.96						}
{									}
{	Màj	: 03.05.97						}
{		  (ajout de BGP_Enable, BGP_Disable et BGP_Enabled)	}
{									}
{***********************************************************************}
 
{$A+,B-,D+,E-,F-,G+,I-,L+,N+,O-,P-,Q-,R-,S-,T-,V-,X-}
{$M 4096,0,0}
 
Unit BGPH;
 
Interface
 
{***********************************************************************}
{	Test si le géstionnaire a déjà été installé			}
{***********************************************************************}
 
Function  BGP_Installed:Boolean;
 
{***********************************************************************}
{	Test si les vecteurs d'intérruptions ont été détournés		}
{***********************************************************************}
 
Function  BGP_VectorsEqual:Boolean;
 
{***********************************************************************}
{	Autorise le géstionnaire à appeler la BGP			}
{***********************************************************************}
 
Procedure BGP_Enable;
 
{***********************************************************************}
{	Intérdit le géstionnaire à appeler la BGP			}
{***********************************************************************}
 
Procedure BGP_Disable;
 
{***********************************************************************}
{	Renvoie l'état d'activation de la BGP				}
{***********************************************************************}
 
Function  BGP_Enabled:Boolean;
 
{***********************************************************************}
{									}
{	Installation du géstionnaire de la BGP				}
{									}
{	Ticks	 : Compteur d'activation de la BPG			}
{		   (1 = 1 / 18eme de secondes)				}
{									}
{	ProcAddr : Addresse de la procédure Pascal devant être		}
{		   appellée par le géstionnaire				}
{									}
{	Remarque : Si le géstionnaire a dejà été installé alors		}
{		   l'appel de cette procédure sera ignoré		}
{									}
{***********************************************************************}
 
Procedure BGP_Install(Ticks:Word;ProcAddr:Pointer);
 
{***********************************************************************}
{									}
{	Désinstallation du géstionnaire de la BGP			}
{									}
{	Sortie : Result = 0 : Désinstallation efféctuée avec succès	}
{			= 1 : Le géstionnaire n'était pas installé	}
{			= 2 : Les vecteurs d'intérruptions ont été	}
{			      détournés (désinstallation impossible)	}
{									}
{***********************************************************************}
 
Function BGP_UnInstall:Byte;
 
 
Implementation
 
Var
 ExitSave,
 Int08Save, Int13Save, Int28Save:Pointer;
 
{***********************************************************************}
{									}
{	Déclarations des procédures/fonctions externes gérant la	}
{	procédure d'arrière plan					}
{									}
{	Pour de plus amples informations sur les déclarations de	}
{	routines externes :						}
{									}
{	Chapitre 23, "Edition de liens avec du code assembleur",	}
{	page 283 du guide du programmeur Turbo PASCAL 7.0		}
{									}
{***********************************************************************}
 
Function  BGP_Installed:Boolean;External;
 
Function  BGP_VectorsEqual:Boolean;External;
 
Procedure BGP_Enable;External;
Procedure BGP_Disable;External;
 
Function  BGP_Enabled:Boolean;External;
 
Procedure BGP_Install(Ticks:Word;ProcAddr:Pointer);External;
Function  BGP_UnInstall:Byte;External;
{$L BGPH.OBJ}
 
{***********************************************************************}
{									}
{	Sauvegarde des adresses des vecteurs d'intérruptions qui	}
{	seront détournés par BGP_Install				}
{									}
{	Remarque importante :						}
{									}
{	Si vous ne créez pas de procédure de sortie dans votre		}
{	programme afin de désinstaller le géstionnaire, alors la	}
{	procédure de sortie de cette unité est prévue pour le faire	}
{	à votre place, en appelant BGP_UnInstall.			}
{									}
{	Mais un simple appel à BGP_Uninstall peut ne pas suffir, car	}
{	si vous comptez détournez les vecteurs 08h, 13h et/ou 28h	}
{	AVANT un appel à BGP_Install, et que l'exécution de votre	}
{	programme s'intérrompt brusquement suite à une erreur par	}
{	exemple, alors la procédure de sortie restaurera les vecteurs	}
{	que l'unité aura pris soin de sauvegarder.			}
{									}
{***********************************************************************}
 
Procedure SaveIntVectors;Assembler;
Asm
	MOV	AX,3508H
	INT	21H
	MOV	Int08Save.WORD[0],BX
	MOV	Int08Save.WORD[2],ES
	MOV	AL,13H
	INT	21H
	MOV	Int13Save.WORD[0],BX
	MOV	Int13Save.WORD[2],ES
	MOV	AL,28H
	INT	21H
	MOV	Int28Save.WORD[0],BX
	MOV	Int28Save.WORD[2],ES
End;
 
{***********************************************************************}
{	Restauration des adresses des vecteurs d'intérruptions		}
{	d'origines							}
{***********************************************************************}
 
Procedure RestoreIntVectors;Assembler;
Asm
	PUSH	DS
	LDS	DX,Int08Save
	MOV	AX,2508H
	INT	21H
	LDS	DX,Int13Save
	MOV	AL,13H
	INT	21H
	LDS	DX,Int28Save
	MOV	AL,28H
	INT	21H
	POP	DS
End;
 
{***********************************************************************}
{									}
{	Procédure de sortie						}
{									}
{	Dans cette unité, la création d'une procédure de sortie est	}
{	impérative car elle permet, en l'occurence, de désinstaller	}
{	le géstionnaire, et de ce fait, de restaurer les vecteurs d'	}
{	intérruptions 08h, 13h et 28h préalablement détournés par ce	}
{	dernier								}
{									}
{	Pour de plus amples informations sur les procédures de		}
{	sortie :							}
{									}
{	Chapitre 20, "Contrôle de l'exécution des programmes",		}
{	page 243 du guide du programmeur Turbo PASCAL 7.0		}
{									}
{***********************************************************************}
 
Procedure BGPH_ExitProc;Far;
Begin
 ExitProc:=ExitSave;
 BGP_Disable;
 If BGP_Uninstall=2Then RestoreIntVectors
End;
 
{***********************************************************************}
{	Initialisation de l'unité					}
{***********************************************************************}
 
Begin
 ExitSave:=ExitProc;
 ExitProc:=@BGPH_ExitProc;
 SaveIntVectors
End.
Qu'en pensez-vous ?