<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Speicherzugriff]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>also manchmal kann man mit dem Thema Pointer, Zeiger, Adressierung richtig verzweifeln. Beisse mir schon seit Tagen die Zähne daran aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> , deshalb hier der Hilferuf!<br />
Folgendes Problem ich steuer drei Threads die über eine &quot;gemeinsame&quot; Variablen struktur in Verbindung stehen.</p>
<p>D.h. liest der client Zeichen aus dem RECV-Befehl aus, dann soll der Write Befehl aktiv werden und die Zeichen in eine Datei ablegen.<br />
Dies macht er auch ganz braf. Bis auf ein paar Zeichen (meist immer die ersten vier) die falsch sind.</p>
<p>D.h. ich bin der Meinung, dass ich irgend etwas falsch mache mit der Speicherübergabe und keine Ahnung habe was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> .<br />
Ich habe mal hier unten den Aufruf der Threads hineingestellt und weiter unten den write-Thread.</p>
<p>Auszug aus Main:</p>
<p>[cpp]</p>
<pre><code>extern int client(struct FLAG *client_param);
extern DWORD WINAPI handle_error(struct FLAG *check_flag);
extern int write(struct FLAG *write_param);
extern int convert(struct FLAG *convert_flag);

int main()
{
	FLAG *error_flag = (FLAG*)malloc(sizeof(FLAG));
	HANDLE  hThreadArray[MAX_THREADS]; 
	DWORD   dwThreadIdArray[MAX_THREADS];

	InitializeCriticalSection(&amp;cs);
	error_flag-&gt;initiate=-1;
	error_flag-&gt;signal[0]=ENABLE_RECV;
	error_flag-&gt;signal[1]=BLOCK_WRITE;
	error_flag-&gt;signal[4]=START_SERVER;
	error_flag-&gt;flag=BUFFER_FREE;
	error_flag-&gt;recieved=0;

	//Create the thread
	hThreadArray[0]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)client, error_flag, 0, &amp;dwThreadIdArray[0]);
	//hThreadArray[1]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)handle_error, error_flag, 0,&amp;dwThreadIdArray[1]);
	hThreadArray[2]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)write, error_flag, 0, &amp;dwThreadIdArray[2]);
	// CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)convert, error_flag, 0, 0);
</code></pre>
<p>Der Write-Thread (die Datei test.pdf ist nur ein Testname, versende einfach eine PDF Datei, die ich dann abspeichern will):</p>
<p>[cpp]</p>
<pre><code>extern CRITICAL_SECTION cs;
int write(struct FLAG *write_param)
{
	FILE *fp;
	int i=0;
	for(;;)
	{
		EnterCriticalSection(&amp;cs);
		if (write_param-&gt;flag==BUFFER_FILLED &amp;&amp; write_param-&gt;signal[0]==BLOCK_RECV)
			write_param-&gt;signal[1]=ENABLE_WRITE;

		if (write_param-&gt;signal[1]==ENABLE_WRITE)
		{
			fp=fopen(&quot;test.pdf&quot;,&quot;rb+&quot;);
			if (fp==NULL)
				fp=fopen(&quot;test.pdf&quot;,&quot;wb&quot;);
			else
				fseek(fp,0,SEEK_END);
			if(write_param-&gt;signal[3]==NEW_HEADER)
			{
				fp=fopen(&quot;test.pdf&quot;,&quot;wb&quot;);
				write_param-&gt;signal[3]=OLD_HEADER;
			}
			else
				fseek(fp,0,SEEK_END);

			for(i=0;i&lt;write_param-&gt;recieved;i++)
			{	
					fputc(write_param-&gt;buffer[i],fp);
			}
			fclose(fp);
			write_param-&gt;signal[1]=BLOCK_WRITE;
			write_param-&gt;signal[0]=ENABLE_RECV;
			write_param-&gt;flag=BUFFER_FREE;
			memset(write_param-&gt;buffer,0,strlen(write_param-&gt;buffer)); 
			write_param-&gt;recieved=0;

		}
		LeaveCriticalSection(&amp;cs);
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/218717/speicherzugriff</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 22:04:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218717.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Jul 2008 09:26:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherzugriff on Thu, 24 Jul 2008 09:26:17 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>also manchmal kann man mit dem Thema Pointer, Zeiger, Adressierung richtig verzweifeln. Beisse mir schon seit Tagen die Zähne daran aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> , deshalb hier der Hilferuf!<br />
Folgendes Problem ich steuer drei Threads die über eine &quot;gemeinsame&quot; Variablen struktur in Verbindung stehen.</p>
<p>D.h. liest der client Zeichen aus dem RECV-Befehl aus, dann soll der Write Befehl aktiv werden und die Zeichen in eine Datei ablegen.<br />
Dies macht er auch ganz braf. Bis auf ein paar Zeichen (meist immer die ersten vier) die falsch sind.</p>
<p>D.h. ich bin der Meinung, dass ich irgend etwas falsch mache mit der Speicherübergabe und keine Ahnung habe was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> .<br />
Ich habe mal hier unten den Aufruf der Threads hineingestellt und weiter unten den write-Thread.</p>
<p>Auszug aus Main:</p>
<p>[cpp]</p>
<pre><code>extern int client(struct FLAG *client_param);
extern DWORD WINAPI handle_error(struct FLAG *check_flag);
extern int write(struct FLAG *write_param);
extern int convert(struct FLAG *convert_flag);

int main()
{
	FLAG *error_flag = (FLAG*)malloc(sizeof(FLAG));
	HANDLE  hThreadArray[MAX_THREADS]; 
	DWORD   dwThreadIdArray[MAX_THREADS];

	InitializeCriticalSection(&amp;cs);
	error_flag-&gt;initiate=-1;
	error_flag-&gt;signal[0]=ENABLE_RECV;
	error_flag-&gt;signal[1]=BLOCK_WRITE;
	error_flag-&gt;signal[4]=START_SERVER;
	error_flag-&gt;flag=BUFFER_FREE;
	error_flag-&gt;recieved=0;

	//Create the thread
	hThreadArray[0]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)client, error_flag, 0, &amp;dwThreadIdArray[0]);
	//hThreadArray[1]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)handle_error, error_flag, 0,&amp;dwThreadIdArray[1]);
	hThreadArray[2]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)write, error_flag, 0, &amp;dwThreadIdArray[2]);
	// CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)convert, error_flag, 0, 0);
</code></pre>
<p>Der Write-Thread (die Datei test.pdf ist nur ein Testname, versende einfach eine PDF Datei, die ich dann abspeichern will):</p>
<p>[cpp]</p>
<pre><code>extern CRITICAL_SECTION cs;
int write(struct FLAG *write_param)
{
	FILE *fp;
	int i=0;
	for(;;)
	{
		EnterCriticalSection(&amp;cs);
		if (write_param-&gt;flag==BUFFER_FILLED &amp;&amp; write_param-&gt;signal[0]==BLOCK_RECV)
			write_param-&gt;signal[1]=ENABLE_WRITE;

		if (write_param-&gt;signal[1]==ENABLE_WRITE)
		{
			fp=fopen(&quot;test.pdf&quot;,&quot;rb+&quot;);
			if (fp==NULL)
				fp=fopen(&quot;test.pdf&quot;,&quot;wb&quot;);
			else
				fseek(fp,0,SEEK_END);
			if(write_param-&gt;signal[3]==NEW_HEADER)
			{
				fp=fopen(&quot;test.pdf&quot;,&quot;wb&quot;);
				write_param-&gt;signal[3]=OLD_HEADER;
			}
			else
				fseek(fp,0,SEEK_END);

			for(i=0;i&lt;write_param-&gt;recieved;i++)
			{	
					fputc(write_param-&gt;buffer[i],fp);
			}
			fclose(fp);
			write_param-&gt;signal[1]=BLOCK_WRITE;
			write_param-&gt;signal[0]=ENABLE_RECV;
			write_param-&gt;flag=BUFFER_FREE;
			memset(write_param-&gt;buffer,0,strlen(write_param-&gt;buffer)); 
			write_param-&gt;recieved=0;

		}
		LeaveCriticalSection(&amp;cs);
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1552886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1552886</guid><dc:creator><![CDATA[Tentone]]></dc:creator><pubDate>Thu, 24 Jul 2008 09:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriff on Fri, 25 Jul 2008 04:55:21 GMT]]></title><description><![CDATA[<p>hmm ich hab mir dein code nich richt angeschaut, aber so wie ich das überlogen habe, hast du 2 threads, einer liest DIE daten und der andere schreibt DIESE Daten. korrekt?</p>
<p>und wenn du dein Programm startetst, sind die ersten zeichern falsch (die vom wirte thread) geschrieben werden , korrekt?</p>
<p>vll. solltest du die thread syncronisieren, so das der write thread erst daten schreiben, wenn der read thread überhaupt schon daten gelesen hat.... sonstkom nur müll raus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1553313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553313</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 25 Jul 2008 04:55:21 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriff on Fri, 25 Jul 2008 05:00:57 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für Deine Antwort.<br />
Aber diese Beiden (Read und Write) Threads habe ich mittels Flags synchronisiert.<br />
Und trotzdem kommt nur Quatsch raus. Komisch ist nur, dass es die ersten vier Bits sind.</p>
<p>Gruß und erstmal danke<br />
Tentone</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1553314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553314</guid><dc:creator><![CDATA[Tentone]]></dc:creator><pubDate>Fri, 25 Jul 2008 05:00:57 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriff on Fri, 25 Jul 2008 05:39:22 GMT]]></title><description><![CDATA[<p>hmm... wo ist die read funktion?</p>
<p>Wie machst das denn eigentlich? bzw. wie syncronisierst du das?</p>
<p>Readthread list X Bytes, währendessen wartet write thread?<br />
Writthread schreibt diese X Bytes, währenddessen wartet readthread?</p>
<p>du erzeugst ja zuerst den Read thread , und gehst davon aus das dieser als erstes startet um die ersten bytes zu lesen. Naja aber das ist nich gewährleistet.</p>
<p>du sollst deine thread mit events syncronisieren WaitForsingleObject. SetEvent<br />
Reset Event</p>
<pre><code class="language-cpp">extern HANDLE eWrite;
extern HANDLE eRead;

int main(void){
eWrite= CreateEvent(...);
eRead= CreateEvent(...);
.
.
.
//Thread erzeugen
}
int write(struct FLAG *write_param)
{

 WaitForSingleObject(eWrite,INFINTE);
 // SCHREIBEN
 SetEvent(eRead);
 ResetEvent(eWrite);

}

int read(struct FLAG *write_param)
{

 WaitForSingleObject(eRead,INFINTE);
   // LESEN
 SetEvent(eWrite);
 ResetEvent(eRead);

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1553325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553325</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 25 Jul 2008 05:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherzugriff on Fri, 25 Jul 2008 08:23:11 GMT]]></title><description><![CDATA[<p>Danke für Deine Antwort.</p>
<p>Werde ich probieren, kann aber sein, dass ich nochmal Lauthals HILFE rufe:) ....</p>
<p>Gruß und schönen Tag noch</p>
<p>Tentone</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1553388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553388</guid><dc:creator><![CDATA[Tentone]]></dc:creator><pubDate>Fri, 25 Jul 2008 08:23:11 GMT</pubDate></item></channel></rss>