Переглянути джерело

Improved update behavior, added some tracing mechanisms

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6712 8c9fc860-2736-0410-a75d-ab315db34111
felixf 9 роки тому
батько
коміт
8e2d323c0b
4 змінених файлів з 90 додано та 64 видалено
  1. 14 1
      source/Generic.Reflection.Mod
  2. 14 4
      source/WMComponents.Mod
  3. 8 2
      source/WMMessages.Mod
  4. 54 57
      source/WMProperties.Mod

+ 14 - 1
source/Generic.Reflection.Mod

@@ -856,8 +856,21 @@ CONST
 	END GetVariableAdr;
 	
 	PROCEDURE GetProcedureName*(pc: ADDRESS; VAR name: ARRAY OF CHAR; VAR startpc: ADDRESS);
+	VAR m: Modules.Module; offset: LONGINT;
 	BEGIN
-		name := ""
+		name := "";
+		m := Modules.ThisModuleByAdr0(pc);
+		IF m # NIL THEN
+			offset := FindByAdr(m.refs,0,pc);
+			IF offset >= 0 THEN
+				GetFullName(m.refs, offset, name);
+				IF GetChar(m.refs, offset) = sfProcedure THEN
+					SkipSize(offset);
+					SkipString(m.refs,offset);
+					startpc := GetAddress(m.refs, offset);
+				END;
+			END;
+		END;
 	END GetProcedureName;
 
 TYPE

+ 14 - 4
source/WMComponents.Mod

@@ -1299,7 +1299,11 @@ TYPE
 
 		(** Is called before any sub-components are drawn *)
 		PROCEDURE DrawBackground*(canvas : WMGraphics.Canvas);
-		VAR color : LONGINT; name:Strings.String;
+		VAR color,i : LONGINT; name:Strings.String;
+		(* DebugUpdates can be used in order to visualize updates via some color cycling 
+			Moreover, it slows down display extremely such that updates can be seen
+		*)
+		CONST DebugUpdates = FALSE;
 		BEGIN
 			(* message tracing
 			IF sequencer = Messages.debug THEN
@@ -1316,8 +1320,14 @@ TYPE
 			END;
 			*)
 			CheckReadLock;
-			color := fillColor.Get();
-			IF color # 0 THEN canvas.Fill(GetClientRect(), color, WMGraphics.ModeSrcOverDst) END;
+			
+			IF DebugUpdates THEN
+				canvas.Fill(GetClientRect(), Kernel.GetTicks()*100H +0FFH, WMGraphics.ModeSrcOverDst);
+				FOR i := 0 TO 10000000 DO END;
+			ELSE
+				color := fillColor.Get();			
+				IF color # 0 THEN canvas.Fill(GetClientRect(), color, WMGraphics.ModeSrcOverDst) END;
+			END;
 		END DrawBackground;
 
 		(** Is called after all sub-components are drawn *)
@@ -1396,7 +1406,7 @@ TYPE
 				END;
 				c := GetNext(c);
 			END;
-		END DrawSubComponents;
+			END DrawSubComponents;
 
 		PROCEDURE GetFont*() : WMGraphics.Font;
 		BEGIN

+ 8 - 2
source/WMMessages.Mod

@@ -25,6 +25,7 @@ CONST
 	(** Gather statistics about added/discarded messages? *)
 	Statistics* = FALSE;
 	TraceQueue = FALSE;
+	TraceOverflows = TRUE;
 	MsgTypeMax* = 13;
 
 
@@ -144,7 +145,7 @@ TYPE
 			IF stopped THEN TRACE("!!!!!!!!!!!!!", stopped) END;
 			FOR i := 0 TO LEN(msgQ)-1 DO
 				new[i] := msgQ[(head+i) MOD LEN(msgQ)];
-				IF TraceQueue OR stopped (* OR (LEN(new) > 1024) *) THEN
+				IF TraceOverflows OR stopped THEN
 				msg := new[i];
 				IF msg.msgType < LEN(MsgName) THEN COPY(MsgName[msg.msgType], name) ELSE name := "" END;
 				TRACE(i,"***************", name);
@@ -267,7 +268,12 @@ TYPE
 							END;
 							(* keep *)
 							RETURN TRUE;
-
+						ELSE (* we assume that invaidates on the same component
+									that immediately follow each other are very close to each other
+									If this turns out to be untrue, we could add a heuristics here *)
+								Merge(msgQ[pos].x, msgQ[pos].y, msgQ[pos].dx, msgQ[pos].dy, msg.x, msg.y, msg.dx, msg.dy);
+								(* keep *)
+								RETURN TRUE;
 						END;
 					ELSIF msg.msgSubType = MsgSubAll THEN
 						(* keep *)

+ 54 - 57
source/WMProperties.Mod

@@ -345,7 +345,6 @@ TYPE
 			IF GetModel(object, model) THEN
 				type.value := value;
 				model.SetGeneric(type, res);
-
 			END;
 		END UpdateModel;
 
@@ -569,7 +568,7 @@ TYPE
 	VAR
 		value : LONGINT;
 		min, max : LONGINT;
-		bounded, silent : BOOLEAN;
+		bounded : BOOLEAN;
 
 		PROCEDURE UpdateProperty;
 		VAR integer: Types.Integer; model: Models.Model; res: LONGINT;
@@ -628,23 +627,6 @@ TYPE
 			ReleaseRead;
 		END GetIsBounded;
 
-		PROCEDURE SetSilent*(isSilent : BOOLEAN);
-		BEGIN
-			AcquireWrite;
-			IF isSilent # silent THEN
-				silent := isSilent;
-				Stamp;
-			END;
-			ReleaseWrite
-		END SetSilent;
-
-		PROCEDURE GetSilent*(VAR isSilent : BOOLEAN);
-		BEGIN
-			AcquireRead;
-			isSilent := silent;
-			ReleaseRead;
-		END GetSilent;
-
 		PROCEDURE Validate(v : LONGINT) : LONGINT;
 		BEGIN
 			IF bounded THEN RETURN Strings.Max(min, Strings.Min(max, v))
@@ -678,25 +660,34 @@ TYPE
 			ReleaseRead;
 			RETURN r
 		END Get;
-
+		
+		(* set without updates -- use only when you definitely want to avoid updates *)
+		PROCEDURE SetPassive*(value: LONGINT);
+		VAR v: LONGINT;
+		BEGIN
+			v := Validate(value);
+			AcquireWrite;
+			SELF.value := v;
+			NotDefault;
+			ReleaseWrite
+		END SetPassive;
+		
 		PROCEDURE Set*(value : LONGINT);
+		VAR v: LONGINT;
 		BEGIN
+			v := Validate(value);
 			AcquireWrite;
-			IF Validate(value) # SELF.value THEN
-				SELF.value := Validate(value);
-				IF ~silent THEN
-					Changed;
-					IF object # NIL THEN UpdateModel END;
-				END
-			ELSIF ~nonDefault & ~silent THEN
+			IF v # SELF.value THEN
+				SELF.value := v;
+				Changed;
+				IF object # NIL THEN UpdateModel END;
+			ELSIF ~nonDefault THEN
 				Changed;
 			END;
 			NotDefault;
 			ReleaseWrite
 		END Set;
 
-
-
 		PROCEDURE FromXML*(xml : XML.Element);
 		VAR
 			en : XMLObjects.Enumerator;
@@ -756,7 +747,7 @@ TYPE
 	VAR
 		value : LONGREAL;
 		min, max : LONGREAL;
-		bounded, silent : BOOLEAN;
+		bounded : BOOLEAN;
 
 		(** Confines the possible input values between min and max. Implicitly activates the bounds check. If the current value
 			lies outside the bounds, it is truncated to the nearest and a change notification is sent after the end of the transaction. *)
@@ -796,23 +787,6 @@ TYPE
 			ReleaseRead;
 		END GetIsBounded;
 
-		PROCEDURE SetSilent*(isSilent : BOOLEAN);
-		BEGIN
-			AcquireWrite;
-			IF isSilent # silent THEN
-				silent := isSilent;
-				Stamp;
-			END;
-			ReleaseWrite
-		END SetSilent;
-
-		PROCEDURE GetSilent*(VAR isSilent : BOOLEAN);
-		BEGIN
-			AcquireRead;
-			isSilent := silent;
-			ReleaseRead;
-		END GetSilent;
-
 		PROCEDURE Validate(v : LONGREAL) : LONGREAL;
 		VAR result : LONGREAL;
 		BEGIN
@@ -840,11 +814,11 @@ TYPE
 		END ToStream;
 
 		PROCEDURE UpdateProperty;
-		VAR boolean: Types.Longreal; model: Models.Model; res: LONGINT;
+		VAR longreal: Types.Longreal; model: Models.Model; res: LONGINT; silent: BOOLEAN; 
 		BEGIN
 			IF GetModel(object, model) THEN
-				 model.GetGeneric(boolean, res);
-				 IF res = 0 THEN Set(boolean.value) END;
+				 model.GetGeneric(longreal, res);
+				 IF res = 0 THEN Set(longreal.value) END;
 			END;
 		END UpdateProperty;
 
@@ -869,20 +843,33 @@ TYPE
 			RETURN r
 		END Get;
 
+		PROCEDURE SetPassive*(value: LONGREAL);
+		VAR v: LONGREAL;
+		BEGIN
+			v := Validate(value);
+			AcquireWrite;
+			SELF.value := v;
+			NotDefault;
+			ReleaseWrite
+		END SetPassive;
+		
 		PROCEDURE Set*(value : LONGREAL);
+		VAR v: LONGREAL;
 		BEGIN
+			v := Validate(value);
 			AcquireWrite;
-			IF Validate(value) # SELF.value THEN
-				SELF.value := Validate(value);
-				IF ~silent THEN Changed
-				END;
-				IF (object # NIL) THEN UpdateModel END;
-			ELSIF ~nonDefault & ~silent THEN
-				Changed
+			IF v # SELF.value THEN
+				SELF.value := v;
+				Changed;
+				IF object # NIL THEN UpdateModel END;
+			ELSIF ~nonDefault THEN
+				Changed;
 			END;
 			NotDefault;
 			ReleaseWrite
 		END Set;
+		
+		
 
 		PROCEDURE FromXML*(xml : XML.Element);
 		VAR
@@ -1039,6 +1026,16 @@ TYPE
 			END;
 		END UpdateModel;
 
+		PROCEDURE SetPassive*(value : String);
+		BEGIN
+			AcquireWrite;
+				IF (value = SELF.value) (* reset with self must lead to update *) OR (value = NIL) OR (SELF.value = NIL) OR (value^ # SELF.value^) THEN
+					SELF.value := value; Translate;
+				END;
+				NotDefault;
+			ReleaseWrite
+		END SetPassive;
+
 		PROCEDURE Set*(value : String);
 		BEGIN
 			AcquireWrite;