Vector ?

10/17/2014 21:53 Terrat#1
Hey,
wollte mal etwas Fragen (2 sachen).
Ich verende Vectoren(möchte sie verwenden) in einen TCP Server den ich im Moment schreibe.
Ich habe 2 Threads die die Vectors erstmal bearbeiten.
Code:
Code:
DWORD TCP_Server::Client_Accept_Thread()
{
	sockaddr_in Clientinfo;
	int Clientinfolen = sizeof(Clientinfo);
    ClientSockets.push_back(accept(ListenSocket,(struct sockaddr*)&Clientinfo,&Clientinfolen));		
	Client_Accept_Thread();//Infinit because we want that every time clients can join!
    return 1;
}
DWORD TCP_Server::CheckClientConnection()
{
	for(int CheckClientInt=0;CheckClientInt<ClientSockets.size();CheckClientInt++)
	{

	}
	Sleep(1000);
    return 1;
}
So also ich habe es jetzt so verstanden dass push_back immer das jewalige stück als neues Array item hinten ran hängt. Oder ?
Sprich ich denke jetzt:
push_back(1)
push_back(2)
vector [0]=1
vector [1]=2
Oder bin ich hier auf dem Holzpfad ?

2:
Wie kann ich ein Item eines Vectors so löschen das alle darüber nachrücken (möglichst ohne einen weiteren Vector zu benutzen)
10/17/2014 22:08 snow#2
1) korrekt, std::vector<T>::push_back hängt das Element hinten an
2) std::vector<T>::erase

Deine Client_Accept_Thread-Funktion wird langfristig einen Stack Overflow verursachen.
10/17/2014 22:11 Jeoni#3
Hallo,
ertsmal zu deinen Fragen:
1) Ja, das hast du richtig verstanden. push_back hängt das übergebene Element quasi einfach hinten an den vector ran.
2) Nutze dafür einfach die [Only registered and activated users can see links. Click Here To Register...]-Function. Ist in der Referenz sicher ausreichend gut beschrieben.

Generell müsstest du aber den Zugriff auf den vector aus verschiedenen Threads synchronisieren, da bspw. push_back das interne Array verschieben kann (wenn der intern angeforderte Speicher zu knapp wird), während der andere Thread noch versucht auf ein ggf. nicht mehr vorhandenes Element zuzugreifen.
Die Funktion TCP_Server::Client_Accept_Thread ist zudem eine endlos-rekursive Funktion. Sie ruft sich also ständig selbst auf und returnt damit auch nichts. Das sorgt dafür, dass durch die ganzen rekursiven Aufrufe irgendwann das Limit für den Stack erreicht ist und dir dein Programm abschmiert. Besser dort eine while(true)-Schleife oder noch besser gleich mit einer Abbruchbedingung, da das Programm sicherlich auch mal sauber beedet werden soll (hoffe ich doch wenigstens!?).
Hoffe, dass ich helfen konnte ;)
Mit freundlichen Grüßen
Jeoni

/Edit: Snow war schneller :D
10/17/2014 22:23 Tasiro#4
Quote:
Originally Posted by Dreamsläps View Post
Wie kann ich ein Item eines Vectors so löschen das alle darüber nachrücken (möglichst ohne einen weiteren Vector zu benutzen)
Indem du std::deque oder std::queue verwendest. Dafür sind sie da.

Aber wie Jeoni schon anmerkte, reicht es nicht aus, ein Objekt zu haben, welches dann in unterschiedlichen Threads verwendet wird. Sofern es nicht unbedingt auf die Zeit ankommt, kannst du dann einfach std::mutex und std::lock_guard<std::mutex> verwenden.
10/17/2014 22:28 Terrat#5
Hmm aber kann man das den auch auf linux nutzen ? Bzw hat jemand nen tut wie ich zu vs 2012 nen linux compiler adde?

Ps warum entsteht eigentlich ein Stackoverflow?
10/17/2014 23:48 Tasiro#6
Quote:
Originally Posted by Dreamsläps View Post
Hmm aber kann man das den auch auf linux nutzen ?
Wenn du dich auf die vorherigen Antworten beziehst, dann lautet die Antwort "ja". Wenn du dich aber auf den Ausschnitt beziehst, den du zeigtest, dann lautet die Antwort "nein", bis du DWORD und Sleep definierst.

Quote:
Originally Posted by Dreamsläps View Post
Ps warum entsteht eigentlich ein Stackoverflow?
Weil sich TCP_Server::Client_Accept_Thread unbedingt selbst aufruft.
10/17/2014 23:55 Terrat#7
Hm habe es in ne while schleife gepackt programm crasht trotzdem nach ner weile hmm.
Code:
Problemsignatur:
  Problemereignisname:	APPCRASH
  Anwendungsname:	TCP SRV.exe
  Anwendungsversion:	0.0.0.0
  Anwendungszeitstempel:	54418ba8
  Fehlermodulname:	MSVCR110.dll
  Fehlermodulversion:	11.0.50727.1
  Fehlermodulzeitstempel:	5011aa2a
  Ausnahmecode:	40000015
  Ausnahmeoffset:	000a0a94
  Betriebsystemversion:	6.1.7601.2.1.0.768.3
  Gebietsschema-ID:	1031
  Zusatzinformation 1:	1468
  Zusatzinformation 2:	1468fb912db7ee8787f9a8bfd90cdc61
  Zusatzinformation 3:	72a6
  Zusatzinformation 4:	72a6ff73740b7655ce9ec0ee937a1d85
Debugge gerade warte das es wd crasht ...

Soo.
Code:
throw.cpp
+		&ThisException	0x042df234 {ExceptionCode=3765269347 ExceptionFlags=1 ExceptionRecord=0x00000000 {ExceptionCode=??? ...} ...}	EHExceptionRecord *
+		&ThisException.params	0x042df248 {magicNumber=429065504 pExceptionObject=0x042df270 pThrowInfo=0x5df83278 {msvcr110d.dll!__TI2?AVbad_alloc@std@@} {...} }	EHExceptionRecord::EHParameters *
+		ThisException	{ExceptionCode=3765269347 ExceptionFlags=1 ExceptionRecord=0x00000000 {ExceptionCode=??? ExceptionFlags=...} ...}	EHExceptionRecord
		ThisException.NumberParameters	3	unsigned long
Code:
 	KernelBase.dll!76c9b727()	Unknown
 	[Frames below may be incorrect and/or missing, no symbols loaded for KernelBase.dll]	
>	msvcr110d.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Line 152	C++
 	msvcr110d.dll!operator new(unsigned int size) Line 63	C++
 	SAP Pro.exe!std::_Allocate<unsigned int>(unsigned int _Count, unsigned int * __formal) Line 28	C++
 	SAP Pro.exe!std::allocator<unsigned int>::allocate(unsigned int _Count) Line 591	C++
 	SAP Pro.exe!std::_Wrap_alloc<std::allocator<unsigned int> >::allocate(unsigned int _Count) Line 877	C++
 	SAP Pro.exe!std::vector<unsigned int,std::allocator<unsigned int> >::_Reallocate(unsigned int _Count) Line 1501	C++
 	SAP Pro.exe!std::vector<unsigned int,std::allocator<unsigned int> >::_Reserve(unsigned int _Count) Line 1532	C++
 	SAP Pro.exe!std::vector<unsigned int,std::allocator<unsigned int> >::push_back(unsigned int && _Val) Line 851	C++
 	SAP Pro.exe!TCP_Server::Client_Accept_Thread() Line 84	C++
 	SAP Pro.exe!StartClientAcceptThread(void * arg) Line 23	C++
 	kernel32.dll!753733ca()	Unknown
 	ntdll.dll!77689ed2()	Unknown
 	ntdll.dll!77689ea5()	Unknown
Code:
DWORD TCP_Server::Client_Accept_Thread()
{
	while(KeepClientAcceptThreadAllive)
	{
		sockaddr_in Clientinfo;
		int Clientinfolen = sizeof(Clientinfo);
		ClientSockets.push_back(accept(ListenSocket,(struct sockaddr*)&Clientinfo,&Clientinfolen));		
	}
	ClientAcceptThreadIsAlive=false;
    return 1;
}