|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysłany: Pią 21:25, 19 Maj 2006 Temat postu: Semofory w C++ :/ |
|
|
Piszę do osób, które tak jak ja, popełniły ten koszmarny błąd i wybrały sobie na ćwiczeniach u dr Kality projekt wielowątkowy pisany w C++. Macie jakieś pomysły na implementację? Słyszałem że o WindowsAPI można zapomnieć, bo jest przestraszne. Czy ktoś z Was używał biblioteki wątkowej dołączajej do Borlanda? Doszły także plotki, że jakiś inny ćwiczeniowiec (nie pamiętam kto dokładnie) udostępnił swim studentom bibliotekę z wątkami własnej roboty. Wiecie coś o tym?
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
exeman
Mistrz grilla
Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów
Skąd: znienacka
|
Wysłany: Pią 22:37, 19 Maj 2006 Temat postu: |
|
|
masz mutexy w C++ (w unix[-opodobnych systemach]) a w windzie piekne sekcje krytyczne.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Sob 3:02, 20 Maj 2006 Temat postu: |
|
|
Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?:
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysłany: Sob 11:18, 20 Maj 2006 Temat postu: |
|
|
Skrobocik napisał: | Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?: | oj, wydaje mi się że raczej nie, przynajmniej mnie nic nna ten temat nie wiadomo...
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
chlebek
alkoholik
Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów
Skąd: Siedlce\Kraków
|
Wysłany: Sob 12:22, 20 Maj 2006 Temat postu: |
|
|
Skrobocik napisał: | Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?: |
Na pewno nie ma, bo pytalem sie dr Wilczka
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
r4ku
żul
Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów
Skąd: klikash? :D
|
Wysłany: Sob 14:04, 20 Maj 2006 Temat postu: |
|
|
byc moze tu znajdziesz cos ciekawego, pod koniec jest cos o wielowatkowosci w cpp wraz z przykladami [link widoczny dla zalogowanych]
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Sob 14:36, 20 Maj 2006 Temat postu: |
|
|
Wiedziałem, że coś mi świta w łebku :wink: Właśnie Kapelka coś pokazywał na ostatnich ćwiczonkach
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Sob 14:41, 20 Maj 2006 Temat postu: |
|
|
Ostatnio piszę co nieco w WinAPI i mam już gotowych parę klas do tworzenia wątków i sekcji krytycznej. Jeśli komuś się przyda, to mogę tu wrzucić.
EDIT:
Zapraszam:
[link widoczny dla zalogowanych]
G++/Windows only
Kompilacja przykładu:
g++ -o threads.exe main.cpp libthcs.a
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Sob 20:58, 20 Maj 2006 Temat postu: |
|
|
tez mam opakowane w klasy win api
macie tam watki i semaforki
dalem pelny kod więc nie zapomnijcie dodac do projektu "Thread.cpp"
jest tez przyklad z opisem w "main.cpp"
[link widoczny dla zalogowanych]
dziala z: GCC, visual
z borlandem pewnie tez ale nie mam gdzie sprawdzic
jak cos nie dziala to piszcie tutaj
samodzielna walka z win api to nic ciekawego:)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Sob 21:23, 20 Maj 2006 Temat postu: |
|
|
SZCZUR: źle zrobiłeś ochronę przed kopiowaniem. Jeśli program będzie kompilowany z NDEBUG, to asercja zostanie wyrzucona z kodu wynikowego i program pójdzie w krzaki. Standardowym sposobem na to jest zadeklarowanie operatora przypisani ORAZ konstruktora kopiującego jako prywatne metody. Wtedy nie trzeba ich implementować - zostawiasz same deklaracje. Bo teraz można zrobić kopię wątku:
MyThread t1;
MyThread t2(t1);
Poza tym nie bardzo mi się podoba, że gdy obiekt wątku wychodzi z zasięgu, to stopujesz go. Ja rozwiązałem to inaczej - dałem użytkownikowi możliwość zdecydowania.
To takie moje uwagi odnośnie kodu. Dzięki za podzielenie się nim.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Sob 22:43, 20 Maj 2006 Temat postu: |
|
|
ochrona przed kopiowaniem poprawiona, dzięki.
jezeli obiekt Thread wychodzi poza zakres to watek (z windows) jest konczony, urzytkownik i tak nie mial by juz nad nim kontroli, pojawialo by sie tez pytanie jak dlugo obiek na ktory wskazywal Data() ma byc trzymany.
Po prostu nie widze dla tego zastosowania, jesli ktos chce "długo" mieć thread'a to zrobi new Thread i skasuje kiedy trzeba (np wątek jak dojdzie do konca Run() to zrobi delete this;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Nie 12:53, 21 Maj 2006 Temat postu: |
|
|
SZCZUR: tak siadłem i się zastanawiałem, czemu zrobiłem wątki na na szablonach (lub obiekt wątku jako składowy). Miałem ten sam problem, który masz w swoim kodzie. Jest poważny błąd.
Kod: | #include <windows.h>
#include "Thread.h"
#include <iostream>
using namespace std;
// 1 - obiekt zyje
// 0 - obiekt umarl
struct CzarnaSkrzynka
{
CzarnaSkrzynka() : x(1) { }
~CzarnaSkrzynka() { x = 0; }
int x;
};
class Thread : public S_CThread
{
public:
virtual void Run()
{
while(1)
{
cout << cs.x << endl;
Sleep(100);
}
}
virtual void OnCancel()
{
}
private:
CzarnaSkrzynka cs;
};
int main()
{
Thread* t = new Thread();
t->Start();
Sleep(300);
delete t;
cout << "koniec" << endl;
}
|
W trakcie usuwania obiektu jest już za późno, by stopować wątek, bo on już nie istnieje! Kolejność usuwania obiektów to: obiekt klasy pochodnej -> obiekt klasy bazowej -> obiekty składowe. Więc w Twoim destruktorze, gdy robisz Cancel na wątku, procesor może odebrać czas destruktorowi i dać go znów wątkowi, który już nie istnieje. Żeby to zauważyć empirycznie, trzeba nieco spowolnić destruktor:
Kod: | S_CThread::~S_CThread(void){
Sleep(100);
if(IsRunning())
Cancel();
}
|
Wtedy wyjście programu wygląda u mnie tak:
Kod: | D:\Temp\szczur>test
1
1
1
0
koniec
|
Czyli odwołujesz się do obiektu, który już nie istnieje. W tym przypadku o dziwo program się nie wykrzacza, ale może to prowadzić do naprawdę trudnych do wykrycia błędów.
Jednak implementacja wątków nie jest taka prosta :|
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cheater_
Orajt:)
Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów
|
Wysłany: Nie 13:05, 21 Maj 2006 Temat postu: |
|
|
@SZCZUR - ładne to, i 'dokumentacja' nawet jest :) Dzięki, na obecną chwilę Twoja biblioteka to chyba najwygodniejszy sposób implementacji tego :)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Nie 17:04, 21 Maj 2006 Temat postu: |
|
|
pomyslalem o tym ale w drugą strone:
zeby zrobic szablon i threda urzytkownika jako obiekt skladowy i jest taki problem ze user w swoim konstruktorze moze chciec sie odwolac do mojego S_CThread który jest nieskonstruowany. a ja daje userThreadowi dostęp do S_CThread.
no i żeczywiscie jest maly problem, ale postaram sie to wkrótce poprawic.
Edit:
ale mam juz pomysl, jak tylko przepchne "P" to sie zabiore za to.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stefan
pijak
Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów
|
Wysłany: Nie 22:22, 21 Maj 2006 Temat postu: |
|
|
Rozmawiałem dzis o tym chwilę z moim współlokatorem i zastanawialiśmy się jak to jest zrobione w VCL'u Borlanda, bo tam też jest to zrobione przez funkcje wirtualne. Jest tam wymuszone tworzenie obiektów na stercie, czyli poprzez operator new. Zapewne operator delete jest odpowiednio przeładowany i zajmuje się wszystkim. Jest to też rozwiązanie, ale mnie się średnio podoba, bo duża część piękna klas leży w tym, że destruktor sam się wywoła, gdy skończy się obiekt zasięgu, a tutaj jakoby jest to samo, co w C, tyle że pod inną składnią.
Jakoś nie mogę też sobie wyobrazić, po co użytkownik dostarczający parametr szablonu będącego składową miałby się odwoływać do klasy wątku? Przy odpowiedniej abstrakcji, to użytkownik już obiektu wątku będzie się wszystkim zajmował.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
SZCZUR
żul
Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów
|
Wysłany: Pon 0:04, 22 Maj 2006 Temat postu: |
|
|
zeby dostac parametr Data();
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
h
pijak
Dołączył: 15 Lis 2005
Posty: 134
Przeczytał: 0 tematów
|
Wysłany: Pią 2:27, 09 Cze 2006 Temat postu: |
|
|
ja dzisiaj napisałem projekt w pthread.h, proste, fajne, przyjemne. tylko że ja nie miałem wyboru - ANSI C.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Stasiu
zielony żul
Dołączył: 16 Lis 2005
Posty: 920
Przeczytał: 0 tematów
Skąd: krk
|
Wysłany: Pią 2:37, 09 Cze 2006 Temat postu: |
|
|
Ja lecę na WinAPI. Opakowałem sobie ładnie w klasy i praktycznie przeklepałem z javy wsio ;) Największy problem z tą wizualizacją :/
|
|
Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|