Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Visual-Basic-Forum VB-Paradise.de. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

kay2k4

Fortgeschrittener

  • »kay2k4« ist männlich
  • »kay2k4« ist der Autor dieses Themas

Beiträge: 242

Dabei seit: 3. Oktober 2009

  • Private Nachricht senden

1

Samstag, 23. Januar 2010, 03:40

Restzeitberechnung bei Verschlüsselung?

Hallo liebe comm

Ich habe mal wieder eine frage, ich bin am verzweifel.
Ich habe ne rijndael verschlüsselungsalgo. (Datei Verschlüsselung)
Ud möchte den aktuelen vorgang, sprich den status der verschlüsselung in einer progressbar anzeigen lassen.
Nur im kommen zum verzweifel nicht weiter.
Ich habe über all gegooglet, hier im board den source von kevin89 (Hier ) angeschaut, versucht, und und und...
Wenn jetzt nochmal jemand sagt ich soll googlen, dann drehe ich am rat.
Irgendwie muss es doch möglich sein, wie gesagt habe alles versucht, aber den status anzeigen zu lassen habe ich nicht nie wirklich verstanden, da einige sagen ich sollts mit BGW machen, andere wiederrum sagen bloß nicht mit BGW.

Wie man oben an der zeit zieht, haben mittlerweile knapp 4 uhr morgens, und ratet mal wie lange ich es schon versuche.
Irgendwie will ich das jetzt mal verstehen.
Also wäre nett wenn mir jemand helfen könnte.

MFG
kay2k4
:thumbsup: Wer Rechtschreibfehler findet darf sie behalten. :thumbsup:


  • »Dennis Alexander« ist männlich

Beiträge: 270

Dabei seit: 29. Dezember 2007

Wohnort: dotnetbase.de

  • Private Nachricht senden

2

Samstag, 23. Januar 2010, 11:45

Wenn du von etwas den Vorgang ermitteln willst, benötigst Du eine Schleife, in dern du kleine Mengen von Daten verarbeiten kannst.

http://dotnet-snippets.de/dns/dateientsc…dael-SID80.aspx

Dieses Snippet änderst Du ab und packst es innerhalb eines BackgroundWorkers.

Es bietet eine Schleife an. Innerhalb dieser Schleife kannst du alle wichtigen Parameter per BackGroundWorker.ReportProgress() an den Main-Thread zurückgeben. Anschließend kannst du so alle benötigen Angaben ermitteln und an Labels or whatever innerhalb der GUI weitergeben.

Zu den:

Zitat

, da einige sagen ich sollts mit BGW machen, andere wiederrum sagen bloß nicht mit BGW.
Einen BackgroundWorker (oder einen manuellen Thread) verwendet man immer dann, wenn ein Prozess unter umständen sehr lange dauern kann und während dieser Zeit die Gui der Anwendung nicht einfrieren soll. Siehe dazu auch diesen schönen FAQ-Eintrag von Maximilian: http://dotnetbase.de/faq-warum-frieren-a…n-einb-t49.html

Zitat

Wie man oben an der zeit zieht, haben mittlerweile knapp 4 uhr morgens, und ratet mal wie lange ich es schon versuche.
Irgendwie will ich das jetzt mal verstehen.
Also wäre nett wenn mir jemand helfen könnte.

Ich kenne das Problem -man muss es aber aussitzen ;) Darüberhinaus hilft es oft, sich für ein paar Stunden hinzulegen, oder alternativ etwas anderes zu machen (wie wäre es mit Frühsport) - da kommen meistens die besten Ideen ;)

[OffTopic]

Das ist eine nette Idee. Ich werde später mal eine Klasse dazu schreiben und in meine CodeSammlung aufnehmen ;)

Hier eine C# und VB.NET Fassung: http://dotnetbase.de/cvbnet-verschluesse…tiken-t333.html

WIE LERNE ICH DAS PROGRAMMIEREN AM EINFACHSTEN?
Wer sich nicht an die allg. Umgangsform hält, kommt auf meine Ignore-Liste.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dennis Alexander« (23. Januar 2010, 22:22)


kay2k4

Fortgeschrittener

  • »kay2k4« ist männlich
  • »kay2k4« ist der Autor dieses Themas

Beiträge: 242

Dabei seit: 3. Oktober 2009

  • Private Nachricht senden

3

Samstag, 23. Januar 2010, 18:18

Hay super danke für die ausführliche hilfe.
Ich werde es jetzt mal ausprobieren.
Und HOFFE das es diesmal ohne probleme gehen wird.

Wenn nicht bin ich wieder hier.

Gruß
kay2k4
:thumbsup: Wer Rechtschreibfehler findet darf sie behalten. :thumbsup:


kay2k4

Fortgeschrittener

  • »kay2k4« ist männlich
  • »kay2k4« ist der Autor dieses Themas

Beiträge: 242

Dabei seit: 3. Oktober 2009

  • Private Nachricht senden

4

Samstag, 23. Januar 2010, 19:12

Man man man ich komme zum verzweifel nicht weiter, ich stehe voll aufem schlau.

/Edit:
So habe jetzt nochmal von neu angefangen, also wenn es so richtig ist, dann erstelle ich nen bgw, in dem bgw kommt den der rijndaelalgo.
Da sind wir schon beim ersten problem, wie soll ich den die function im bgw packen.
Also muss ich im bgw die funtion aufrufen? ist das soweit den schon richtig?

Ich habs am anfang immer mit BackgroundWorker1.ReportProgress(10) erhöt, aber dafür brauche ich ja kein bgw das kann man ja auch so erhöhen.
:thumbsup: Wer Rechtschreibfehler findet darf sie behalten. :thumbsup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kay2k4« (23. Januar 2010, 19:20)


5

Samstag, 23. Januar 2010, 19:32

Also bitte keine Doppelposts, dafür gibt es die Bearbeiten-Funktion.

Wo ist dein Problem genau? Poste mal den Code mit dem BackgroundWorker
FTPLib - Einfacher Zugriff auf FTP-Server *** TextEffectsLib - Schöne Effekte für TextBox und Label
SDS FileInfo


kay2k4

Fortgeschrittener

  • »kay2k4« ist männlich
  • »kay2k4« ist der Autor dieses Themas

Beiträge: 242

Dabei seit: 3. Oktober 2009

  • Private Nachricht senden

6

Samstag, 23. Januar 2010, 19:37

Das ist ja das problem.
Da ich vorher noch nie mit einem bgw gearbeitet habe, habe ich somit auch keine erfahrung.
Bin ja gerade dabei es zu verstehen.
Vorher hatte ich es immer einfach in der Function/Sub mit me.progressbach1.value += 10
erhöht.Aber wie man weiß es es nicht exakt.
So ich hann ja wohl schlecht die Function in einem bgw packen, also muss ich es anders machen.
Nur wie.
:thumbsup: Wer Rechtschreibfehler findet darf sie behalten. :thumbsup:


7

Samstag, 23. Januar 2010, 19:45

Schau mal unter folgendem Link, da findest du eine Erklärung zu dem BackgroundWorker

http://msdn.microsoft.com/de-de/library/…28VS.80%29.aspx
FTPLib - Einfacher Zugriff auf FTP-Server *** TextEffectsLib - Schöne Effekte für TextBox und Label
SDS FileInfo


  • »Dennis Alexander« ist männlich

Beiträge: 270

Dabei seit: 29. Dezember 2007

Wohnort: dotnetbase.de

  • Private Nachricht senden

8

Samstag, 23. Januar 2010, 20:43

Hier habe ich einen Auszug aus dem aktuellen Quellcode:

Quellcode

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
    	private void processFileWorker_DoWork(object sender, DoWorkEventArgs e)
    	{
        	// Zunächst lesen wir das Argument aus und casten es zurück zum Klassentyp
        	processWorkerInfo pIWork = (processWorkerInfo)e.Argument;

        	// Wir erstellen eine TimeDate-Variable, inder wir den Startzeitpunkt festlegen
        	// Anhand dieser Variable können wir später die Bytes pro Sekunde errechnen
        	DateTime startTime;
        	cryptStatus cStatus = new cryptStatus();

        	// Wir erstellen eine Try-Anweisung um evtl. Fehler abzufangen
        	try
        	{	    	
		    	// Wir erstellen benötige Objekt zum Verschlüsseln der Datei anhand des AES-Algorithmus
            	byte[] key = Encoding.ASCII.GetBytes(pIWork.passwordString);
            	byte[] iv = Encoding.ASCII.GetBytes(pIWork.ivString);
            	FileStream readStream = new FileStream(pIWork.sourceFile, FileMode.Open);
            	FileStream writeStream = new FileStream(pIWork.targetFile, FileMode.Create);
            	RijndaelManaged riMan = new RijndaelManaged();
            	CryptoStream cryptStream = new CryptoStream(writeStream, riMan.CreateEncryptor(key, iv), CryptoStreamMode.Write);

            	// Die benötigten Variablen für die Schleife und die Verarbeitung
            	byte[] processingData = new byte[pIWork.bufferSize];
            	long bufferCounter = 0;
            	long buffer = 0;
            	long fileLength = readStream.Length;
            	bool done = false;

            	// Wir weisen den jetzigen Startzeitpunkt zu
            	startTime = DateTime.Now;
            	do
	        	{
                	if(bufferCounter >= fileLength - buffer) {
                    	processingData = new byte[fileLength - pIWork.bufferSize];
                    	buffer = readStream.Read(processingData, 0, Convert.ToInt32(fileLength - bufferCounter));
                    	writeStream.Write(processingData, 0, Convert.ToInt32(buffer));
                    	done = true;
                	}

                	buffer = readStream.Read(processingData, 0, Convert.ToInt32(pIWork.bufferSize));
                	writeStream.Write(processingData, 0, Convert.ToInt32(pIWork.bufferSize));
                	bufferCounter += buffer;


                	// Hier werden wir nun unsere Variablen übergeben
                	// Wir nutzen dazu eine weitere eigene Klasse, um dies möglichst einfach
                	// handzuhaben - zunächst müssen wir aber noch einige Werte errechnen
                	

                	// Gesamtgröße in Bytes der zu verschlüsselnden Datei
                	cStatus.fileSize = fileLength;
                	// Größe in Bytes der bereits verschlüsselten Datei
                	cStatus.processedSize = bufferCounter;


                	// Da dies sehr rechtenintensiv ist, und den Thread komplett auslastet, wird die GUI auch
                	// hier nicht mehr reagieren. Wir können die CPU massiv entlasten, indem wir nach allen 4096 Bytes
                	// für 1ms eine Pause einlegen. Dies verlangsamt die Verschlüsselung aber extrem! 
                	System.Threading.Thread.Sleep(1);

                	// Wir übergeben unser Object
                	processFileWorker.ReportProgress(cStatus.percentDone, cStatus);

            	} while (done == false);
        	}
        	catch (Exception)
        	{
            	// Es ist ein Fehler aufgetreten
            	throw;
        	}
    	}

    	private void processFileWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    	{

        	// Wir casten den UserState zu dem Typ unserer Status-Klasse 
        	cryptStatus cStatus = (cryptStatus)e.UserState;

        	// Und updaten die GUI
        	lblSizeComplete.Text = (cStatus.fileSize / 1024 / 1024) + " MB";
        	lblSizeCrypted.Text = (cStatus.processedSize / 1024 / 1024) + " MB";
        	lblBytesPerSecound.Text = (cStatus.bytesPerSecound / 1024 / 1024).ToString() + " MB";
        	lblEstimatedTime.Text = cStatus.timeLeft.TotalSeconds + " Sek";
        	lblPercent.Text = cStatus.percentDone + " %";
        	progressBar1.Value = cStatus.percentDone;
       	
    	}

    	private void processFileWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    	{
        	MessageBox.Show("Vorgang beendet!");
    	}

    	private void btnCryptFile_Click(object sender, EventArgs e)
    	{
        	// Erzeuge neues Objekt von unserer Datenklasse
        	processWorkerInfo pInfo = new processWorkerInfo();

        	// Wir übernehmen die Daten der GUI 
        	// (Ich nehme hier für dieses Beispiel an, das die Daten i.O sind)
        	pInfo.sourceFile = txtSource.Text;
        	pInfo.targetFile = txtTarget.Text;
        	pInfo.bufferSize = Convert.ToInt64(txtBufferSize.Text);
        	pInfo.passwordString = txtPassword.Text;
        	pInfo.ivString = txtSalt.Text;
        	pInfo.operation = true; // Für das Verschlüsseln nutze ich true, andernfalls false

        	// Wir starten den BackgroundWorker und geben als Argument die Klasse mit,
        	// sodass wir nicht auf den anderen Thread zugreifen müssen
        	processFileWorker.RunWorkerAsync(pInfo);

        	
    	}

	}


Ich ergänze es noch mit der Entschlüsselung und werde es dann in meinem Forum posten.
(Ich werde ersteinmal was essen, es wird heute aber noch gepostet ;))

Hier noch ein Bild:



WIE LERNE ICH DAS PROGRAMMIEREN AM EINFACHSTEN?
Wer sich nicht an die allg. Umgangsform hält, kommt auf meine Ignore-Liste.

kay2k4

Fortgeschrittener

  • »kay2k4« ist männlich
  • »kay2k4« ist der Autor dieses Themas

Beiträge: 242

Dabei seit: 3. Oktober 2009

  • Private Nachricht senden

9

Samstag, 23. Januar 2010, 21:02

Hay super, aber mit c# codes kann ich nichts anfangen.
Ja okay müsste man halt umschreiben.
Werds den ma genau durch studieren, die verschlüsselung interessiert mich ja ansich nicht, nur die status rückgabe.
:thumbsup: Wer Rechtschreibfehler findet darf sie behalten. :thumbsup:


  • »Dennis Alexander« ist männlich

Beiträge: 270

Dabei seit: 29. Dezember 2007

Wohnort: dotnetbase.de

  • Private Nachricht senden

10

Samstag, 23. Januar 2010, 21:05

Du kannst es ja wohl umschreiben ;)

C# -> VB ist ja nicht das Problem.


Ich hänge noch etwas an der Entschlüsselung und bin immernoch nicht zum Essen gekommen. Das wird jetzt erledigt und dann werde ich das entschlüsseln noch anpassen.

WIE LERNE ICH DAS PROGRAMMIEREN AM EINFACHSTEN?
Wer sich nicht an die allg. Umgangsform hält, kommt auf meine Ignore-Liste.

  • »Dennis Alexander« ist männlich

Beiträge: 270

Dabei seit: 29. Dezember 2007

Wohnort: dotnetbase.de

  • Private Nachricht senden

11

Samstag, 23. Januar 2010, 22:22

Ich habe es dir auch nochmal nac vb.net umgeschrieben.

Siehe: http://dotnetbase.de/cvbnet-verschluesse…tiken-t333.html

WIE LERNE ICH DAS PROGRAMMIEREN AM EINFACHSTEN?
Wer sich nicht an die allg. Umgangsform hält, kommt auf meine Ignore-Liste.