Avatar billede mbm2016 Nybegynder
19. december 2009 - 09:38 Der er 2 kommentarer og
1 løsning

C++ MultiThreads ved fil redigering

Hej eksperter,


Jeg sidder og skal lave et program som kan redigere i en fil, imens en anden tråd redigere i en anden fil.

Jeg har lavet en BackgroundWorker klasse til lejligheden, men selvom det er helt vidt forskellige filer der redigeres i samtidig, får jeg Access Violation i Memory, et eller andet sted.

Min BackgroundWorker klasse er her(HVis det nu skulle være her fejlen ligger):
http://www.magnusbm.dk/kodenbgworker.htm

Jeg håber i kan hjælpe


På forhånd tak for hjælpen
Avatar billede mbulow Nybegynder
19. december 2009 - 17:27 #1
Har du ikke en lille fejl her?
("Off by one" fejl :)

template<typename T>
Pos ArrayList<T>::LastIndexOf(T Value)
{
    int i;
    for(i = this->Count;i>0;i--)
    {
        if(this->array[i] == Value){break;}
    }
    return i;
}

Der kan du da ihvertfald få en access violation...
Du starter din søgning "efter" sidste element i arrayet og du søger aldrig i første element.

Skal det ikke være:

template<typename T>
Pos ArrayList<T>::LastIndexOf(T Value)
{
    int i;
    for(i = this->Count - 1;i>=0;i--)
    {
        if(this->array[i] == Value){break;}
    }
    return i;
}
Avatar billede segmose Nybegynder
21. december 2009 - 00:07 #2
Du har følgende::

template<typename T> 
NoReturn ArrayList<T>::Add(T Value)  { 
this->array[this->Count] = Value; 
this->Count++; 
}

Som jeg mener bør være

template<typename T> 
NoReturn ArrayList<T>::Add(const T& Value)  { // brug referance så slipper du for en masse unødvendige kald af copy contructor. Brug const så spare du måske compileren for noget kode.
if (this->Count == this->capacity) {
  ExpandArrayOrFail(); // <- hvis max capacitet så udvid eller fejl
}
this->array[this->Count] = Value; 
this->Count++; 
}

Check for om capacity er nået mangler nogle steder.
Desuden er "this->" unødvendigt i de fleste tilfælde.

Her returnere du en kopi af array[x] er det meningen?

template <typename T> 
T ArrayList<T>::operator [](Index x)  { 
  if(x <= this->Count && x >= 0)  { 
    return this->array[x]; 
  } 
}; 

Normalt bruger man

T& ArrayList<T>::operator [](const Index x)  { 

for at man kan behandle indholdet af array[x] og

const T& ArrayList<T>::operator [](const Index x) const { 

for at kompileren kan genere bedre kode når den ved du ikke vil ændre noget. Hvis Index var noget andet end en simple type som int så ville jeg også lave den til en ref.

I ovenstående har du
if(x <= this->Count && x >= 0)  {
burde det ikke være
if(x < this->Count && x >= 0)  {
Ellers får du endnu end off by 1 fejl?

Du laver en masse new operation som jeg mener er unødvendige da man i de fleste af dine tilfælde kunne kopier i array'et uden at new'e.
Hvis din klasse ikke er meget speciel så kan mange af dine kopi loops erstates af memmove/memcpy, for bedre performance.
Avatar billede mbm2016 Nybegynder
22. december 2009 - 23:18 #3
halløjsa, jeg har fundet fejlen selv den lå i denne funktion, for da jeg slettede den, virkede det hele fint:

void ListenToThread(void * param)
{
    Thread * thr = (Thread*)param;
    WaitForSingleObject(thr->Handle,INFINITE);
    thr->OnWorkEnd.Send();
}


men kan så bare ikke finde ud af hvordan jeg skal implementere mulighed for at vente på en thread lukker/er færdig?

På forhånd mange tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester