Hollosi Information eXchange /HIX/
HIX CODER 1272
Copyright (C) HIX
2001-08-25
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 Re: divide processekkel (mind)  123 sor     (cikkei)
2 Memo color (mind)  10 sor     (cikkei)
3 Adatok XLS -be (mind)  12 sor     (cikkei)
4 Delphi (mind)  21 sor     (cikkei)
5 minimize (mind)  9 sor     (cikkei)

+ - Re: divide processekkel (mind) VÁLASZ  Feladó: (cikkei)

On 21 Aug 01, at 11:33,  wrote:

> A kovetkezo a problemam: linux alatt divide et impera modszer
> segitsegevel kellene rendezni egy sort... Ez idaig ok is lenne
> csakhogy a ket reszsorozatot ket kulonallo process kellene rendezze
> es igy tovabb ... Na itt vagyok megakadva... Halas lennek ha valaki
> ramutatna a hibara.

Ket processz ket kulonallo cimterrel dolgozik, vagyis az egyik altal
modositott valtozot a masik nem latja. Tehat ha berendezi egy
processz a tomb felet, a masik a masik felet, akkor az osszefesulo
mindebbol semmit sem lat! Ketfelekeppen jarhatsz el: az egyik,
hogy processzek helyett thread-eket hasznalsz (a thread
modositasait a tobbi thread is latja). Ha mindenfelekeppen
processz kell, akkor jon a masik megoldas: shared memoriaban
kell tarolnod a tombot (man shmget, illetve lesz kesobb egy pelda).

Mas gond is van egyebkent: A wait() barmelyik gyerek processz
befejezese utan visszater, viszont te kettot is inditottal, szoval az
egyik befejezte akkorra, de a masik meg fut. Ha csak ket
processzet hasznalsz, akkor egyszerubben is megoldhatod: a
gyerek rendezi az elso felet, a szulo a masikat, es miutan
megrendezte, bevarja az egy szem gyereket, utana osszefesuli a
tomb-feleket:

#include <sys/shm.h>
 ....
int shmid = -1;
int *x;
 ....
void impera(int bal, int jobb)
{
	if ((jobb-bal) <= 1)
		rendez(bal,jobb);
	else {
		int m=(bal+jobb)/2;
		impera(bal,m);
		impera(m+1,jobb);
		fesul(bal,m,jobb);
	}
}

void divide(int n)
{
	int m = n/2;
	pid_t child;
	if ((child=fork()) == 0) {		// child
		impera(1,m);
		exit(0);
	} else {		// parent
		if (child==-1) error("fork error\n");
		impera(m+1,n);
		wait(0);
		fesul(1,m,n);
	}
}

int main(int argc, char *argv[])
{
	int n=argc-1;
	int i;

	shmid = shmget(IPC_PRIVATE, (n+1)*sizeof(int), 0600);
	if (shmid==-1) error("shmget error\n");

	x = (int *)shmat(shmid, 0, 0);		// attach
	if (x==-1) error("shmat error\n");

	for (i=1; i<=n; i++)
		x[i] = atoi(argv[i]);
	divide(n);
	for (i=1; i<=n; i++)
		printf("%d\n", x[i]);

	shmdt(x);		// detach
	shmctl(shmid, IPC_RMID, 0);	// remove

	return 0;
}

(Megjegyzes: Az shmget utan valamikor mindenfelekeppen kell
IPC_RMID is, egyebkent a program terminalasa utan is foglalva
marad a shared memoria! Szoval az error() fuggveny mielott csinal
egy exit()-et (gondolom csinal), hivnia kell egy
shmctl(shmid,IPC_RMID,0)-at ha nem -1 az shmid erteke!)

Ha tobb processzet akarsz esetleg kesobb hasznalni (mondjuk
egy 4 processzoros gepen jobb 4-et futtani, mint kettot), akkor igy
modosithatod a divide-t:

#define PROCOK 4
void divide(int n)
{
	pid_t child[PROCOK];
	int p;
	int bal=1;
	int jobb;
	for (p=1; p<PROCOK; p++) {
		jobb = n*p/PROCOK;
		if ((child[p]=fork()) == 0) {		// child
			impera(bal,jobb);
			exit(0);
		}
		// parent
		if (child[p]==-1) error("fork error\n");
		bal = jobb+1;
	}
	impera(bal,n);	// az utolsot mi magunk csinaljuk
	// fesulesek:
	waitpid(child[1], 0, 0);
	jobb = n*1/PROCOK;
	for (p=2; p<PROCOK; p++) {
		int m=jobb;
		waitpid(child[p], 0, 0);
		jobb = n*p/PROCOK;
		fesul(1,m,jobb);
	}
	fesul(1,jobb,n);
}

Nem probaltam ki egyiket sem, de remelem, futna :)

István
+ - Memo color (mind) VÁLASZ  Feladó: (cikkei)

Hello!

Az lenne a kerdesem, hogy Delphiben hogyan tudom
a Memo szinet, az ott megadottakon kivül, valami masra
valtoztatni, egyaltalan lehetseges-e ez.

elore is koszi!

Aleex
(ICQ: 104542002)
+ - Adatok XLS -be (mind) VÁLASZ  Feladó: (cikkei)

Nem exportálni akarsz XLS -be? :-)
Szerintem a fejlesztőeszközhöz biztosan adtak ODBC
drivert Excel fájlokhoz. Ha találsz ilyet, akkor
már csak létrehozod a cél adatbázist, és már mehetnek
is az INSERT -ek.
Ennél egyszerűbbet egyelőr nem tudok ajánlani.
Van egy bonyolultabb is, az az amikor DBF -be exportálsz, OLE -n keresztül betö
ltöd az Excelt, és egy OLE interface -en keresztül kiadott SaveAs -el kiírod XL
S -be. Ha a visible property -t False -ra állítod, a felhsználónak még csak sej
telme sem lesz, hogy közben elindult és leállt az Excel.

(webes bekuldes, a bekuldo gepe: farewall.cib.hu)
+ - Delphi (mind) VÁLASZ  Feladó: (cikkei)

Sziasztok!

egy apro problemam akadt(Delphi 5 Enterprise):

---
procedure TForm1.Memo1Change(Sender: TObject);
;
---
Ez igy tokeletesen mukodik. A statusbarba kiirja a sorok es a karakterek
szamat.
De ha a 'TMemo' helyett, 'RichEdit'-et hasznalok akkor a statusbarban nem
jelenik meg semmi!

Otletek?

a legjobbakat:
Kulcsar Zsolt

+ - minimize (mind) VÁLASZ  Feladó: (cikkei)

Sziasztok Coderek!

Egy baratom kerdeset tolmacsolom feletek:
>Namarmost az a problema, hogy egy MS Access urlaprol kis meretbe
>akarom vinni nemcsak az urlapot (docmd.minimize), hanem az egesz
>Access-t.
Tudtok segiteni? Johet listara is, maganba is. Elore is koszonom

Balazs

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS