You are on page 1of 14

VBJ n.

75 maggio-giugno 2007
Regular Expression parte 2
di Vito Vessia
In questa seconda parte ci concentreremo su una implementazione rea-
le delle Regular Expression, quella fornita dal motore di Scripting Versio-
ne 5.5 o superiore di Microsoft. Vedremo come sfruttare questa libreria
COM in linguaggi molto diffusi quali Visual Basic, Delphi e VBScript.
Vito Vessia
`
E cofondatore del-
la codeBehind S.r.l.
(http://www.codeBehind.it),
una software factory di
applicazioni enterprise,
web e mobile, dove
progetta e sviluppa ap-
plicazioni e framework
in .NET, COM(+) e Del-
phi occupandosi degli
aspetti architettura-
li.
`
E autore del libro
Programmare il cellu-
lare, Hoepli, 2002, sulla
programmazione dei
telefoni cellulari connes-
si al PC con protocol-
lo standard AT+
pubblicato su
WWW.INFOMEDIA.IT

stampa digitale da
Lulu Enterprises Inc.
stores.lulu.com/infomedia
Infomedia
Infomedia ` e limpresa editoriale che da quasi venti an-
ni ha raccolto la voce dei programmatori, dei sistemi-
sti, dei professionisti, degli studenti, dei ricercatori e dei
professori dinformatica italiani.
Sono pi ` u di 800 gli autori che hanno realizzato per le te-
state Computer Programming, Dev, Login, Visual Basic
Journal e Java Journal, molte migliaia di articoli tecnici,
presentazioni di prodotti, tecnologie, protocolli, strumen-
ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-
tagemmi. Oltre 6 milioni di copie distribuite, trentamila
pagine stampate, fanno di questa impresa la pi` u grande ed
inuente realt` a delleditoria specializzata nel campo della
programmazione e della sistemistica.
In tutti questi anni le riviste Infomedia hanno vissuto del-
la passione di quanti vedono nella programmazione non
solo la propria professione ma unattivit` a vitale e un vero
divertimento.
Nel 2009, Infomedia ` e cambiata radicalmente adottando
un nuovo modello aziendale ed editoriale e si ` e organiz-
zata attorno ad una idea di Impresa Sociale di Comunit` a,
partecipata da programmatori e sistemisti, separando le
attivit` a di gestione dellinformazione gestite da un board
comunitario professionale e quelle di produzione gesti-
te da una impresa strumentale. Questo assetto ` e in linea
con le migliori esperienze internazionali e rende Infome-
dia ancora di pi ` u parte della Comunit` a nazionale degli
sviluppatori di software.
Infomedia ` e media-partner di manifestazioni ed eventi in
ambito informatico, collabora con molti dei pi` u impor-
tanti editori informatici italiani come partner editoriale e
fornitore di servizi di localizzazione in italiano di testi in
lingua inglese.
Limpaginazione automatica di questa rivista ` e realizzata al
100% con strumenti Open Source usando OpenOffice,
Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp,
Python e BASH
For copyright information about the contents of Visual
Basic Journal, please see the section Copyright at the
end of each article if exists, otherwise ask authors. In-
fomedia contents is 2007 Infomedia and released as
Creative Commons 2.5 BY-NC-ND. Turing Club content
is 2007 Turing Club released as Creative Commons
2.5 BY-ND.
Le informazioni di copyright sul contenuto di Visual Ba-
sic Journal sono riportate nella sezione Copyright al-
la ne di ciascun articolo o vanno richieste direttamente
agli autori. Il contenuto Infomedia ` e 2007 Infomedia
e rilasciato con Licenza Creative Commons 2.5 BY-NC-
ND. Il contenuto Turing Club ` e 2007 Turing Club e
rilasciato con Licenza Creative Commons 2.5 BY-ND. Si
applicano tutte le norme di tutela dei marchi e dei segni
distintivi.
`
E in ogni caso ammessa la riproduzione parziale o tota-
le dei testi e delle immagini per scopo didattico purch e
vengano integralmente citati gli autori e la completa
identicazione della testata.
Manoscritti e foto originali, anche se non pubblicati, non
si restituiscono.
Contenuto pubblicitario inferiore al 45%.
La biograa dellautore riportata nellarticolo e sul
sito www.infomedia.it ` e di norma quella disponibi-
le nella stampa dellarticolo o aggiornata a cu-
ra dellautore stesso. Per aggiornarla scrivere a
info@infomedia.it o farlo in autonomia allindirizzo
http://mags.programmers.net/moduli/biograa
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
IeguIar xpressIon
Seconda Iarle
GL9LWR9HVVLD
Ia prIma parle dI queslo corso suIIe IeguIar x-
pressIon vI sar sembrala un po` lroppo leorIca e
aslralla e peraIlro prIva dI codIce dI programma-
zIone. II codIce, InIallI, dona sempre una sensazIo-
ne dI consIslenza a quaIsIasI concello dI InIormalI-
ca leorIca. I`obIellIvo era dI Inlrodurre I rudImenlI
suIIe espressIonI regoIarI senza IegarII a nessuna
ImpIemenlazIone, anaIogamenle a quanlo sI Iareb-
be per II IInguaggIo dI InlerrogazIone SQI, che
aIquanlo neulro rIspello aI dalabase solloslanle e
sIcuramenle Io rIspello aI IrameworR dI accesso
aI dalI ulIIIzzalo.
Ier cuI, pur rIbadendo che Iegx una lecnoIo-
gIa presenle e sIrullabIIe ormaI In numerosI IIn-
guaggI dI programmazIone e su sIslemI operalIvI
dIIIerenlI, In queslo arlIcoIo Invece cI concenlrere-
mo suIIa IIbrerIa Micrcscjt VB8cript Begu|or L+-
pressicu 5.5 IornIla con Inlernel xpIorer 5.5 o suc-
cessIvI e IIberamenle scarIcabIIe ed InslaIIabIIe su
lulle Ie versIonI dI WIndows anche non In bundIe
con Inlernel xpIorer, ma come parle deIIo ScrIpl
ngIne 5.5.
/DOLEUHULDLQGHWWDJOLR
Quesla ImpIemenlazIone
pressoch compIela e IornIsce
un parser Iegx polenle e ve-
Ioce che polr gI soddIsIare Ia
gran parle deIIe esIgenze dI eIa-
borazIone deIIe slrInghe. SI lralla
dI una IIbrerIa IornIla come par-
le deI IrameworR dI VScrIpl e
come laIe gI embedded neI
IInguaggIo, neI senso che negII
scrIpl dI queslo IInguaggIo non
dovrele nemmeno IslanzIare II
molore con una CreoteOb)ect,
ma polrele procedere con una
sempIIce Neu:
'V8Scr1pt
Set kegfx New kegfxp
'V8A
01m kegfx as kegfxp
01m Matchfo11 As Matchfo11ect1on
01m Match As Match
Set kegfx freate0h]ect{"V8Scr1pt
.kegfxp")
9LWR 9HVVLD |oe||a e sv//oa a//caz/on/ e /|amewo|k
occoandos/ de// ase||/ a|ch/|e||o|a// $c|/ve da ann/ e| /e
|/nc/a// |/v/s|e /|a//ane d/ |o|ammaz/one ed e ao|o|e de/
//b|o P|o|amma|e // ce//o/a|e Hoe// 2002 so/ |o|oco//o
s|anda|d A7+ de/ |e/e/on/ ce//o/a|/ con Poo esse|e con|a||a|o
||am/|e e-ma// a///nd/|/zzo vvess/a@ka|ama//com
Iu questo seccudo porte ci ccuceutreremc su uuo imp|emeuto:icue reo|e
de||e Begu|or L+pressicu, que||o jcruito do| mctcre di 8criptiug Versicue
5.5 c supericre di Micrcscjt. Vedremc ccme sjruttore questo |ibrerio COM
iu |iuguoggi mc|tc dijjusi quo|i Visuo| Bosic, De|pni e VB8cript.
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
okegfx.Pattern " 10X{\d(3))-1.{\."
queslo punlo sI Imposleranno Ie proprIe-
l dI scansIone deI molore:
,JQRUH&DVH IndIca che deve scansIonare
Ie occorrenze In modaIIl FDVHLQVHQVLWLYH;
0XOWL/LQH deve Inlerprelare gII IndIcalorI
dI InIzIo e IIne slrInga, cIo $ e , come InI-
zIo e IIne dI una IInea, consIderando quIndI
I CIII come IndIcalorI dI IIne IInea;
*OREDO deve eslrarre lulle Ie occorrenze
(malch) che rIspondono aI pallern e non Ier-
marsI aIIa prIma.
okegfx.1gnorefase 1rue
okegfx.Mu1t1L1ne 1rue
okegfx.01oha1 1rue
QuIndI sI polr IInaImenle eseguIre Ia
scansIone IacendosI reslIluIre come rIsuI-
lalo una coIIeclIon dI malch, cIo una Ma-
lchCoIIeclIon:
'esecuz1one de1 pattern su un testo passato
come parametro
Set Matchfo11 kegfx.fxecute{"10X001-1.
045826,1,"AL1M.")
I`oggello IondamenlaIe appunlo VScrIpl_
Iegxp_55.Iegxp, II molore. SI supponga dI
voIer Inlerprelare Ia slrInga dI esempIo gI
presenlala neI prImo arlIcoIo j1|:
10X001-1.045826,1,"AL1M","0fPfk18","Ik011A",
"MfLf 1kfN1.","k0",2002-09-29
10X001-2.45454354,34534534,3453456
10X002-1.022342,,"AL1M","f0NIfI","LA111f",
"SfAM0k.MASA"
10X002-2.3243441
10X003-1.111134,,AL1M,f0NIfI,LA111f,LA11f
AL1ff,,2002-12-29
10X003-2.232454354,13203456
cuI appIIcheremo II pallern gI anaIIzzalo
neIIo slesso arlIcoIo:
10X{\d(3))-1.{\d+),\d*,"?{|\w|.|\s|-
|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-
|+)"?,"?{|\w|.|\s|-|+)"?{?.,"?{\w*)"?{?.,{\
d(4))-{\d(2))-{\d(2))|)|)\r\n10X\1-2.{\d*){?.
,{\d*)|){?.,{\d*)|){?.,{\d*)|){?.,{\d*)|)
Ier II suo ulIIIzzo sI procede con I`assegna-
zIone deI pallern regex aII`oggello, In modo
da preparare II molore aIIa scansIone deIIe
slrInghe secondo laIe pallern:
'assegnaz1one de1 pattern
-PN\YH /DUHIHUHQ]DGDXVDUHQHLSURJHWWL9LVXDO%DVLF
SI polr cosI procedere con Ia Iellura dI
lullI I malch reslIluIlI daIIa scansIone,
magarI con una sempIIce IRUHDFK:
Ior fach Match 1n Matchfo11
0ehug.Pr1nt Match.Va1ue & vhfr1f
Next
II pallern Imposlalo neII`esempIo e ap-
pIIcalo aI leslo vIslo In precedenza cI re-
slIluIsce lre malch, uno per cIascuno deI
lre bIocchI dI record presenlI neI leslo e
cIo II bIocco IIX001:
10X001-1.045826,1,"AL1M","0fPfk18","Ik011A,
"MfLf 1kfN1.","k0",2002-09-29
10X001-2.45454354,34534534,3453456
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
SeguIlo daI bIocco IIX002:
10X002-1.022342,,"AL1M","f0NIfI","LA111f",
"SfAM0k.MASA"
10X002-2.3243441
cosI per II lerzo o per lullI gII aIlrI, se ce ne
Iossero slalI. Ma II noslro pallern, come spIe-
galo In j1|, In grado dI eslrarre anche I JUXS
SL, cIo deI sollocampI aII`Inlerno deI malch
che conlengono proprIo Ie InIormazIonI alo-
mIche presenlI neIIa slrInga (neII`esempIo sI
lrallava dI codIce arlIcoIo, descrIzIone arlIco-
Io, unIl dI mIsura, ecc...). I gruppI, come sI rI-
corder, venIvano crealI per ognI sollo-pallern
racchIuso lra parenlesI londe, ad esempIo:
10X{\d(3))-1...
Ier accedere a quesle InIormazIonI daI mo-
deIIo ad oggellI dI VScrIpl Iegxp 5.5, sI do-
vr ulIIIzzare Ia proprIel 6XE0DWFKHV espo-
-PN\YH ,JUXSSLHVWUDWWLSHUSRVL]LRQH
sla daII`oggello Malch. SI lralla deIIa soII-
la coIIeclIon, ma quesla voIla gII Ilem sono
deI sempIIcI VarIanl non lIpIzzalI che con-
lengono dIrellamenle II vaIore deIIa sollo-
occorrenza:
0ehug.Pr1nt Match.SuhMatches{1)
Iove I`IndIce 1 rappresenla II numero pro-
gressIvo deI submalch, assegnalo daI molo-
re In ordIne dI eIaborazIone deI gruppI, cIo
II prImo gruppo lrovalo avr IndIce 1, II se-
condo 2, e cosI vIa.
Ior fach 0roup 1n Match.SuhMatches
0ehug.Pr1nt 0roup
Next
L'esempio VisuaI Basic 6
IaI sIlo Ilp://Ilp.InIomedIa.Il possIbIIe sca-
rIcare II codIce VIsuaI asIc 6 dI esempIo deI
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
progello 9%5HJ([YES che moslra come ulI-
IIzzare queslI oggellI. InnanzIlullo In Figura 1
possIbIIe osservare Ie IIbrerIe da reIerenzIa-
re. Ia Figura 3 moslra Invece II noslro pIcco-
Io cIIenl V6 In azIone: vIene IornIlo In Inpul
II noslro leslo dI esempIo coI record dI ana-
graIIca da Imporlare (W[W7H[W), solloponendoIo
aIIa ben nola Iegx (W[W3DWWHUQ) appIIcando
Ia IunzIone rIporlala neI LisIaIo 1.
aIlresI vero che, conoscendo Ia slrullura
deIIa slrInga e avendo gI deIInIlo I`espressIo-
ne regoIare che Ia Inlerprela, sI gI a cono-
scenza deI sIgnIIIcalo dI cIascuna sollo-occor-
renza e per cuI sI pu procedere con I`even-
luaIe manIpoIazIone dI quesle InIormazIonI
specIIIche, come moslralo neI sempIIce esem-
pIo deI LisIaIo 3.
SI pu nolare come sI procedulo aIIa rIcerca
punluaIe dI specIIIche sollo-occorrenze (CodI-
ce rlIcoIo, IescrIzIone, Gruppo MerceoIogI-
co, ecc.) sempIIcemenle conoscendo Ia Ioro
posIzIone e quIndI I`ordIne dI eslrazIone deI
gruppI daI pallern. In Figura 3 possIbIIe os-
servare II rIsuIlalo a vIdeo deII`esecuzIone deI
precedenle codIce.
/D5HSODFH
In`aIlra polenle IunzIone oIIerla daI molorI
Iegx e quIndI anche da queIIo IornIlo neIIa
IIbrerIa VScrIpl IeguIar xpressIons 5.5,
Ia possIbIIIl dI eIIelluare Ia soslIluzIone dI
occorrenze dI solloslrInghe con sequenze dI
carallerI preslabIIIle, che possono anche es-
3PZ[H[V
01m kegfx As kegfxp
01m Matchfo11 As Matchfo11ect1on
01m Match As Match
01m 0roup As Var1ant
01m 1 As 1nteger
01m ] As 1nteger

Set kegfx New kegfxp
kegfx.Pattern txtPattern.1ext
kegfx.1gnorefase 1rue
kegfx.Mu1t1L1ne 1rue
kegfx.01oha1 1rue
Set Matchfo11 kegfx.fxecute{txt1ext.1ext)

txtkesu1t.1ext ,"
Ior fach Match 1n Matchfo11
txtkesu1t.1ext txtkesu1t.1ext & ,Match. , & Match.Va1ue & vhfrLf & vhfrLf

Ior fach 0roup 1n Match.SuhMatches
1 1 + 1
txtkesu1t.1ext txtkesu1t.1ext & ,0roup. , & 1 & , , & 0roup & vhfrLf
Next

txtkesu1t.1ext txtkesu1t.1ext & vhfrLf & _
," & _
vhfrLf & vhfrLf & vhfrLf
Next
L'implemehtaziohe
VBScript FegEx 5.5
completa e potehte
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
sere dInamIcamenle rappresenlale da gruppI
eslralle daIIa slrInga dI orIgIne. Ier sempIIII-
care, dalo un leslo dI orIgIne:
&3 q OD SULPD ULYLVWD GL SURJUDPPD]LRQH
LQ ,WDOLD &3 q HGLWR GDO *UXSSR (GLWRULDOH
,QIRPHGLD
SI polrebbe voIer soslIluIre Ia paroIa &3con
&RPSXWHU3URJUDPPLQJ, ognI voIla che sI pre-
senla neIIa slrInga. SI proceder quIndI In que-
slo modo: InnanzIlullo sI deIInIr II pallern
che lrova Ie occorrenze dI CI neIIa paroIa.
{fP)
queslo punlo sI proceder con I`esecuzIone
deIIa IepIace suIIa slrInga In queslIone:
01m kegfx As kegfxp
01m rep1acedStr1ng As Str1ng
Set kegfx New kegfxp
kegfx.Pattern "{fP)"
kegfx.1gnorefase 1rue
kegfx.Mu1t1L1ne 1rue
kegfx.01oha1 1rue
3PZ[H[V
01m Match As Match
01m 0roup As Var1ant
01m ] As 1nteger
txtkesu1t.1ext ""
Ior fach Match 1n Matchfo11
txtkesu1t.1ext txtkesu1t.1ext & "Ana11s1 de1 record. " & Match.Va1ue &
vhfrLf & vhfrLf

txtkesu1t.1ext txtkesu1t.1ext & "fod1ce art1co1o . " &
Match.SuhMatches{1) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "0escr1z1one art1co1o. " &
Match.SuhMatches{5) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "0ruppo merceo1og1co . " &
Match.SuhMatches{2) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "Iam1g11a merceo1og. . " &
Match.SuhMatches{3) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "Sottofam1g11a merc. . " &
Match.SuhMatches{4) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "0n1t d1 m1sura . " &
Match.SuhMatches{6) & vhfrLf
1f Match.SuhMatches{I) <> "" 1hen
txtkesu1t.1ext txtkesu1t.1ext & "0ata de1 1otto . " & _
f0ate{Match.SuhMatches{I) & "/" & _
Match.SuhMatches{8) & "/" & Match.SuhMatches{9)) & vhfrLf
fnd 1f
txtkesu1t.1ext txtkesu1t.1ext & "fod1ce a harre 1 . " &
Match.SuhMatches{10) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "fod1ce a harre 2 . " &
Match.SuhMatches{11) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "fod1ce a harre 3 . " &
Match.SuhMatches{12) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "fod1ce a harre 4 . " &
Match.SuhMatches{13) & vhfrLf
txtkesu1t.1ext txtkesu1t.1ext & "fod1ce a harre 5 . " &
Match.SuhMatches{14) & vhfrLf

txtkesu1t.1ext txtkesu1t.1ext & vhfrLf & _
"" & _
vhfrLf & vhfrLf & vhfrLf
Next
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
rep1acedStr1ng kegfx.kep1ace{"fP e 1a pr1ma
r1v1sta d1 programmaz1one 1n 1ta11a. fP e ed1to
da1 0ruppo fd1tor1a1e 1nfomed1a.", "fomputer
Programm1ng")
II rIsuIlalo, cIo II conlenulo deIIa varIabIIe
UHSODFHG6WULQJ, sar:
fomputer Programm1ng e 1a pr1ma r1v1sta d1 pro-
grammaz1one 1n 1ta11a. fomputer Programm1ng e
ed1to da1 0ruppo fd1tor1a1e 1nfomed1a.
In`aIlra possIbIIIl oIIerla daIIa IepIace
queIIa dI soslIluIre Ie solloslrInghe che cor-
rIspondono ad un cerlo pallern, con gruppI
calluralI neI pallern slesso. Ier megIIo com-
prendere queslo concello, sI lornI aII`esem-
pIo deIIa slrInga dI ImporlazIone anagraIIche
arlIcoII. SI polrebbe, ad esempIo, voIer soslI-
luIre I`Inlero malch calluralo, con II seguen-
le pallern dI IepIace:
0ruppo. $3 Iam1g11a. $4 Sottofam1g11a. $5 {$6)
SI vuoIe cIo che cIascun gruppo dI record
deI IIIe ImporlazIone (record IIX001, IIX002,
ecc.) venga soslIluIlo con una slrInga deI
lIpo Gruppo: seguIla daI codIce deI Grup-
po MerceoIogIco che verr preso dIrellamen-
le daI gruppo (daIIa sollo-occorrenza) numero
8 deIInIla neI noslro pallern (per IdenlIIIca-
re un gruppo In un pallern dI IepIace sI usa
una sInlassI che prevede un carallere $ seguI-
lo daI numero posIzIonaIe deI gruppo), seguI-
la a sua voIla daIIa slrInga IamIgIIa: con II
reIalIvo codIce dI IamIgIIa MerceoIogIca pre-
-PN\YH $FFHVVRSXQWXDOHDLJUXSSLHVWUDWWL
-PN\YH /HIIHWWRGHOOD5HSODFHVXOODQRVWUDVWULQJDGHVHPSLR
/D5HSODFHqOD
SRVVLELOLWjGLHIIHWWXDUH
ODVRVWLWX]LRQH
GLRFFRUUHQ]HGL
VRWWRVWULQJKHFRQDOWUH
VRWWRVWULQJKH
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
sa daI gruppo numero 4, e cosI vIa.
SI osservI dunque II codIce deI progello dI
esempIo VIsuaI asIc 6:
01m kegfx As kegfxp
01m rep1ace1ext As Str1ng
Set kegfx New kegfxp
kegfx.Pattern txtPattern.1ext
kegfx.1gnorefase 1rue
kegfx.Mu1t1L1ne 1rue
kegfx.01oha1 1rue
txtkesu1t.1ext kegfx.kep1ace{txt1ext.1ext,
txtkep1acePattern.1ext)
II rIsuIlalo che ollerremo a vIdeo moslra-
lo In )LJXUD.
/DOLEUHULDLQ'HOSKL
ConsIderando che IIbrerIa MIcrosoIl V-
ScrIpl IeguIar xpressIons 5.5 In Iorma-
lo COM duaIe, opporluno consIderare II
suo ulIIIzzo anche da IInguaggI dIversI da
VIsuaI asIc e persIno da IInguaggI non MI-
crosoIl, come ad esempIo orIand IeIphI. II
looI dI casa orIand non dIspone nalIvamen-
le dI una ImpIemenlazIone deIIe spressIonI
IegoIarI per cuI probabIImenle I`uso dI que-
sla IIbrerIa, graluIla e suIIIcIenlemenle soII-
slIcala e polenle, resla Ia soIuzIone mIgIIore
anche neIIa appIIcazIonI IeIphI, pur essen-
do dIsponIbIII In Iorma Ireeware, shareware o
commercIaIe, dIverse soIuzIonI dI lerze parlI
In codIce. ssa peraIlro graluIla e gI pre-
senle suIIe macchIne cIIenl dI lIpo WIndows
XI o su macchIne WIndows su cuI InslaIIa-
lo Inlernel xpIorer 6.
Ier II suo ulIIIzzo sI dovr procedere In-
nanzIlullo aIIa ImporlazIone deIIa JypeII-
brary (menu Iro]ecl \ Imporl Jype IIbrary
\ InslaII) come moslralo In )LJXUD . Quesla
operazIone produrr Ia soIIla unIl dI codIce
3PZ[H[V
procedure 1Iorm1.cmdProcessf11ck{Sender. 10h]ect);
var
kegfx . 1kegfxp;
Match1tem . Match;
SuhMatchfo11 . 1SuhMatches;
0roup . 01eVar1ant;
1, ]. 1nteger;
heg1n
kegfx. 1kegfxp.freate{n11);
kegfx.Pattern . txtPattern.1ext;
kegfx.1gnorefase . 1rue;
kegfx.Mu1t1L1ne . 1rue;
kegfx.01oha1 . 1rue;
Matchfo11. kegfx.fxecute{txt1ext.1ext) as 1Matchfo11ect1on2;
txtkesu1t.f1ear;
Ior ]. 0 to Matchfo11.fount - 1 do
heg1n
Match1tem. Matchfo11|]| as 1Match2;
txtkesu1t.L1nes.Add{,Match. , + Match1tem.Va1ue);
SuhMatchfo11. Match1tem.SuhMatches as 1SuhMatches;
Ior 1. 0 to SuhMatchfo11.fount - 1 do
txtkesu1t.L1nes.Add{,0roup. , + 1nt1oStr{1 + 1) + , , + SuhMatchfo11|1|);
txtkesu1t.L1nes.Add{#13#10 +
,' +
#13#10#13#10#13#10);
end;
cmdfxtract0ata.fnah1ed. 1rue;
end;
fnd f1ass
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
VBScript FegEx
5.5 resta la
soluziohe
migliore ahche
rispetto ad altre
implemehtaziohi
hative
-PN\YH /DUHIHUHQ]DGDXVDUHQHLSURJHWWL'HOSKL
nalIvo dI proxy suI componenle COM, che
neI caso specIIIco sI chIamer VScrIpl_Ie-
gxp_55_JI.
Iallo queslo, II codIce IeIphI sar pralIca-
menle IdenlIco a queIIo vIslo per V6. NeI-
Ia dIreclory \IeIphIIegx deI sorgenlI dI-
sponIbIIe II progello Iegx.dpr che poI aIlro
non che II rIIacImenlo In IeIphI deI prece-
denle esempIo V. OsservIamone un esem-
pIo neI /LVWDWR.
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
d ecco II noslro programma, dopo Ia lra-
duzIone IeIphI, In esecuzIone come vIene
moslralo In )LJXUD. Ier quanlo rIguarda gII
oggellI In versIone IeIphI bIsogna lener con-
lo dI quaIche curIosa dIIIerenza, Iegala aI pIu
basso IIveIIo In cuI IeIphI opera con gII oggel-
lI COM rIspello a VIsuaI asIc. InnanzIlullo
sI consIderI che I`oggello prIncIpaIe deIIa II-
brerIa, cIo Iegxp, neI proxy IeIphI assu-
me II IamIIIare nome dI JIegxp e dIvenla
IslanzIabIIe neIIa Iorma lradIzIonaIe:
var
kegfx . 1kegfxp;
kegfx. 1kegfxp.freate{n11);
Ier Ia comprensIone deI concellI che ver-
ranno esposlI dI seguIlo necessarIa una co-
noscenza, seppur mInIma, dI MIcrosoIl COM,
per cuI se non sIele proprIo IerralI suII`argo-
menlo, polele saIlare dIrellamenle aIIa par-
le deIIe concIusIonI deII`arlIcoIo, senza per
dImenlIcare dI IncIudere Ia versIone modIII-
cala dI VScrIpl_Iegxp_55_JI.pas soslI-
luendoIa a queIIa prodolla In modo aulomalI-
co da IeIphI. Ia queI momenlo In poI polre-
le ulIIIzzare lulle Ie proprIel e I melodI deI-
I`oggello 5HJ([S e anche I`edIlor dI IeIphI
vI verr In aIulo allraverso II &RGH&RPSOHWD
WLRQ. Ie cose sI compIIcano Ieggermenle per
gII aIlrI oggellI deIIa IIbrerIa, cIo 0DWFK, 0D
WFK&ROOHFWLRQ, ecc. In queslo caso I`Imporla-
zIone non ha prodollo codIce dI proxy aIlrel-
lanlo eIIIcIenle. InnanzIlullo queslI aIlrI og-
gellI non sono dIrellamenle IslanzIabIII come
accade per 5HJ([S, ma vengono reslIluIlI da
melodI e proprIel dI aIlrI oggellI. d esempIo,
come sI rIcorder, II melodo 5HJ([S([HFXWH
reslIluIsce un`Islanza dI 0DWFK&ROOHFWLRQ, Ia
proprIel 0DWFK&ROOHFWLRQ,WHP reslIluIsce
un`Islanza dI 0DWFK che, a sua voIla, espone
una proprIel 0DWFK6XE0DWFKHV appunlo dI
lIpo 6XE0DWFKHV.
NeII`ImporlazIone, per, I vaIorI dI rIlorno
deI melodI e deIIe proprIel Iegxp.xecule,
MalchCoIIeclIon.Ilem e Malch.SubMalches,
3PZ[H[V
procedure 1Iorm1.cmdProcessf11ck{Sender. 10h]ect);
var
kegfx . 1kegfxp;
1, ]. 1nteger;
heg1n
kegfx. 1kegfxp.freate{n11);
kegfx.Pattern . txtPattern.1ext;
kegfx.1gnorefase . 1rue;
kegfx.Mu1t1L1ne . 1rue;
kegfx.01oha1 . 1rue;
Matchfo11. kegfx.fxecute{txt1ext.1ext);
txtkesu1t.f1ear;
Ior ]. 0 to Matchfo11.fount - 1 do
heg1n
txtkesu1t.L1nes.Add{,Match. , + Matchfo11|]|.Va1ue);
Ior 1. 0 to Matchfo11.1tem|]|.SuhMatches.fount - 1 do
txtkesu1t.L1nes.Add{,0roup. , + 1nt1oStr{1 + 1) + , , + Matchfo11|]|.SuhMatches.1tem|1|);
txtkesu1t.L1nes.Add{#13#10 +
,' +
#13#10#13#10#13#10);
end;
cmdfxtract0ata.fnah1ed. 1rue;
end;
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
-PN\YH ,OFOLHQW'HOSKLLQD]LRQH
neI proxy che IeIphI ha crealo a parlIre daI-
Ia JypeIIbrary, hanno perso II lIpo specIIIco e
sono slalI soslIluIlI con deI generIcI IIIspalch,
cIo I`InlerIaccIa IondamenlaIe dI aulomazIo-
ne COM. Queslo, oIlre a non Iar IunzIonare II
Code CompIelalIon deII`ambIenle dI svIIuppo e
ad obbIIgare ad accedere agII oggellI vIa aulo-
mazIone e quIndI In ODWH ELQGLQJ, anzIch ulI-
IIzzare Ie InlerIacce approprIale, coslrInge ad
eIIelluare II caslIng deI lIpI come moslralo In
queslo eslrallo dI IunzIone:
var
kegfx . 1kegfxp;
Match1tem . Match;
SuhMatchfo11 . 1SuhMatches;
.
kegfx. 1kegfxp.freate{n11);
Matchfo11. kegfx.fxecute{txt1ext.1ext) as 1Matchfo11ec-
t1on2;
Match1tem. Matchfo11|1| as 1Match2;
SI pu osserverare come, ulIIIzzando I`ope-
ralore as, sI eIIellua II caslIng deI lIpI aIIa
corrella InlerIaccIa. Ier ovvIare a queslI pro-
bIemI che appesanlIrebbero moIlo II codIce,
suIIIcIenle correggere Ia unIl dI proxy
generala daII`ImporlazIone, cIo VScrIpl_
Iegxp_55_JI.pas, soslIluendo neIIe In-
lerIacce Imporlale lulle Ie occorrenze errale
dI IIIspalch con II lIpo reIalIvo. d esempIo
osservIamo come correggere II melodo xe-
cule dI Jregxp; orIgInarIamenle esso sI pre-
senla cosI:
funct1on 1kegfxp.fxecute{const sourceStr1ng. W1deStr1ng).
101spatch;
Ia nuova versIone Invece sar:
funct1on 1kegfxp.fxecute{const sourceStr1ng. W1deStr1ng).
1Matchfo11ect1on;
queslo punlo II Code CompIelalIon Iun-
zIoner a dovere e II voslro codIce sar pIu
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
veIoce perch non dovr accedere aII`oggel-
lo COM vIa aulomazIone, operazIone che co-
sla moIlo In lermInI dI RYHUKHDG. Io slesso
dIcasI, ad esempIo, per II melodo Gel_Ilem
e per Ia proprIel Ilem deII`InlerIaccIa IMa-
lchCoIIeclIon.
// Mod1f1ca. s1 sost1tu1sce 11 t1po 101spatch co1 p1u ac-
curato 1Matchfo11ect1on
// funct1on 0et_1tem{1ndex. 1nteger). 101spatch; safe-
ca11;
funct1on 0et_1tem{1ndex. 1nteger). 1Match2; safeca11;
0pz|ore 3|gr|lcalo 0escr|z|ore
1HVVXQD
Nessura opz|ore e |rposlala. Corr|sporde a||'erureral|vo
5HJH[2SWLRQV1RQH
, &DVHLQVHQVLWLYH
Ellellua |a scars|ore de||a slr|rga |r roda||la case |rsers|l|ve, c|oe ror la
d|llererza lra |e ra|usco|e e |e r|rusco|e ('ClR0 = 'c|ro). Corr|sporde
a||'erureral|vo 5HJH[2SWLRQV,JQRUH&DVH.
0 0XOWLOLQH
lrposla |a scars|ore |r roda||la ru|l|||re, c|oe |rlerprela | lo|er * e S
core |rd|calor| d| |r|z|o e lre ||rea e ror |r|z|o e lre slr|rga. Corr|sporde
a||'erureral|vo 5HJH[2SWLRQV0XOWLOLQH.
1 &DWWXUDHVSOLFLWD
Callura | so|| grupp| per | qua|| e slalo delr|lo ur rore ed |grora lull| g|| a|lr|.
Corr|sporde a||'erureral|vo 5HJH[2SWLRQV([SOLFLW&DSWXUH.
& &RPSLODWR
E ura caraller|sl|ca de||'|rp|ererlaz|ore.NET de||e Regu|ar Express|or:
perrelle c|oe d| creare e corp||are a| vo|o ur oggello.NET |r grado d|
|rlerprelare |a RegEx |rposlala. 3e preserle, |a scars|ore avv|ere qu|rd|
serpre cor ur oggello cre e |r grado |r rodo ral|vo d| gesl|re que|
pallerr e ror |r rodo |rlerprelalo core accade rorra|rerle. Corr|sporde
a||'erureral|vo 5HJH[2SWLRQV&RPSLOHG.
6 6LQJOHOLQH
lrposla |a scars|ore |r roda||la s|rg|e||re: |rlerprela | lo|er * e S
core |rd|calor| d| |r|z|o e lre slr|rga. Corr|sporde a||'erureral|vo
5HJH[2SWLRQV6LQJOHOLQH.
;
,JQRUDJOLVSD]L
ELDQFKL
lgrora g|| spaz| o|arcr| preserl| re||a RegEx. Corr|sporde a||'erureral|vo
5HJH[2SWLRQV,JQRUH3DWWHUQ:KLWHVSDFH.
5 5LJKW7R/HIW
lrpore |a scars|ore de||a slr|rga da deslra verso s|r|slra. Puo essere
|rposlala so|o a||'|r|z|o de| pallerr. Corr|sporde a||'erureral|vo 5HJH[2SWLR
QV5LJKW7R/HIW
(&0$6FULSW
0uesla opz|ore |rpore |a corpal|o|||la cor |e rego|e de||o slardard
ECVA3cr|pl. lr rea|la e da cors|derars| core ura relaopz|ore percr ror
descr|ve a|cur corporlarerlo spec|lco, ra s| aoo|ra a||e opz|or| lgrore
Case, Vu|l|||re e Corp||ed rerderdo|e corlacerl| ad ECVA3cr|pl. Corr|sporde
a 5HJH[2SWLRQV(&0$6FULSW
// Mod1f1ca. s1 sost1tu1sce 11 t1po 101spatch co1 p1u ac-
curato 1Matchfo11ect1on
// property 1tem|1ndex. 1nteger|. 101spatch read 0et_1tem;
defau1t;
property 1tem|1ndex. 1nteger|. 1Match2 read 0et_1tem;
defau1t;
SaIlIamo ora II reslo deIIe modIIIche (che co-
munque polrele osservare neI sorgenle deIIa
unIl dI proxy), per osservare Invece II melodo
JIorm1.cmdIrocessCIIcR neIIa nuova Iorma
pIu compalla e pIu user-IrIendIy (/LVWDWR).
;HILSSH
42
>>
DEv > n.151 magglo 2007
di *LDQOXLJL'DYDVVL!davassi_inonedia.it
programmazlone 0RELOH
()LJXUD), che, per ortuna, appare solo la prina volta che
viene caricata la DLL. Possiano concedere il pernesso di
esecuzione ed ignorare il nessaggio.
xConcesso il pernesso... eureka! Prenendo il tasto an-
nirereno il nostro PocketPc spegnersi, e dopo 5 secondi
riaccendersi. Lna possibilit che la nornale J9 sicuranente
non prevede!
&RQFOXVLRQLHSRVVLELOLWjGLVYLOXSSR
A livello di progrannazione, nel caso si abbiano conoscenze
di C++, le possibilit di estendere la J9 attraverso JII sono
potenzialnente illinitate. Ad esenpi, possibile estendere
la J9 per ci che concerne la connettivit, il supporto sonoro,
il supporto graico, ino alla possibilit di inplenentare un
database SQL. E chiaro che se J9 inplenentasse un naggior
nunero di unzionalit acilnente utilizzabili, attirerebbe
un gran nunero di sviluppatori e di aziende disposte a in-
vestire nel nondo nobile utilizzando Java. E gi in corso
un progetto open source con questo obbiettivo, -RPHJD
(http://jonega.sourceorge.net). E un progetto che gestisco
personalnente ed inplenenta anche un porting delle OLE6'/
(http://vvv.libsdl.org) per la gestione della graica.
Le possibilit oerte dai dispositivi nobile sono ancora un
enoneno acerbo e poco sruttato, alneno qui in Italia.
*LDQOXLJL'DYDVVL
L:ar:/a : P|s: |n Innr|: In/arm:/|::, :pp:ss|an:/a J|
prar:mm::|an J| j:r:/C++ ` :a/anJ:/ar J| Om:Dr:m (|//p.
//uuu.am:-Jr:m.:am) an: sa:|/! sp:|:||:::/: n||a sr||appa
J| :pp||:::|an| s|s/m| sa J|spas|/|r| Ma|||. Cs/|s: an pra//a
apnsaar: :||:m:/a jOMECA (|//p.//am:.saar:/ar.n/), an:
|||rr|: :| s/nJ |: j9 ://r:rrsa j^I. A//a:|mn/ ` |mp|:/a
:||'|n/rna J||: Ksa|a/|ans (|//p.//uuu.|sa|a/|ans.|/) |:rar: :|
/r:muar| CMS apnsaar: K:|s/:rr (|//p.//uuu.|:|s/:r.ar).
Ionostante le ritrosie all'utilizzo quotidiano di questi di-
spositivi, le potenzialit del nobile in anbito aziendale ed
IT sono talnente esplosive da risultare quasi preoccupanti.
Le possibilit oerte da un Internet pervasivo, accessibile
dovunque e da chiunque sono destinate a canbiare il nostro
nodo di lavorare e di investire. Il nobile-connerce (al-
tres detto n-connerce) ad esenpio solo un petalo della
rosa del uturo che ci aspetta. Approondire lo sviluppo su
dispositivi Mobile, senpre connessi e pervasivi, incentivan-
do sull'utilizzo di tecnologie opensource (PhoneMe alle
porte e il Linux del tablet Iokia770 rappresenta un'ottina
alternativa a WindovsMobile) rappresenta uno degli scenari
pi interessanti del nostro uturo.
27
<<
DEv > n.149 marzo 2007
L: prar:mm::|an :an:arrn/ | /|r:J
della classe Thread che esegue la sincronizzazione ja|n().
Di atto, l'operazione di Join consiste nel bloccare il thread
chianante ino a che il thread speciicato non ternini.
Si veda, ad esenpio, il Listato 9 (C=) e la Figura 5. Si pu
notare che M:|n() si erna, dapprina, alla istruzione
tid1.Join()
in attesa che ternini il prino thread, poi alla istruzione
tid2.Join()
in attesa che ternini il secondo thread. Inine M:|n()
ternina. Da notare il passaggio di una variabile al thread
tranite il netodo S/:r/(r:r). In questo caso non pu essere
usata una istanza di 7|r:JS/:r/ na una istanza di P:r:m/-
r|:J7|r:JS/:r/. Il Listato 10 nostra la versione in C++.
I concetti, discussi in precedenza (nel caso C=), vengono
applicati parinenti.
Questa prina parte sui ondanenti ternina qui. Ho
introdotto, insiene ad alcuni concetti, le basi della pro-
grannazione nultitasking tranite i thread. Ho nostrato
alcuni esenpi riguardo la creazione dei thread, il signiicato
del oreground, del background e della priorit. Inine, ho
accennato ai principi della sincronizzazione.
Con questa base, senplice na necessaria, possiano arontare,
nel prossino nunero, concetti pi conplessi di sincronizza-
zione cone i nutex, i senaori, le sezioni critiche, gli eventi,
i neccanisni di conunicazione, ecc. Trattereno anche dei
deadlock, che si veriicano quando vi sono dei conlitti nella
sincronizzazione. Trattereno del debugging ed altro ancora.
Cvvianente, senpre con lo stesso stile. tranite esenpi.
*LRYDQQL9LYD
|:ar:/a |n I|s|:: J ` ://a:|mn/ |mp|:/a, :am rspans:|||
J||a sr||appa sa//u:r, |n RlS J| an: sa:|/! J| rappa S|x
I|nm:::n|::. Sra| ://|r|/! J| Ja:n:: pr Pram/|a,
:a||:|ar:nJa, |n p:r/|:a|:r, :an |: sJ J| Ram: Cn/ra. S|
a::ap:, /anJ:mn/:|mn/, J| s|s/m| p:r:||||, :an ::r://r|s/|:|
r:|-/|m J as: ||na:| C-||| (C, C++, C=, ::.). D:
a:|:| :nna |:rar: :an M|:rasa// I|sa:| S/aJ|a .^E7
H|nJaus CE.^E7 sa s|s/m| m|JJJ.
'RZQORDGGHOSURJHWWR
5carlca l| progeLLo comp|eLo dl quesLo arLlco|o a||'lndlrlzzo:
ftp:,,ftp.nfcmeda.t,pub,DEV.,Lstat,Dev149,Speca|e.zp
9%- N. 75 - Magglo/Glugno 2OO7 N. 75 - Magglo/Glugno 2OO7 9%-
7(&1,&+( 7(&1,&+(
&RQFOXVLRQL
Ie spressIonI IegoIarI sono uno slru-
menlo moIlo polenle, ma presenlano una
curva dI apprendImenlo InIzIaIe non bana-
Ie; Invece I`apprendImenlo e I`uso dI aIcu-
ne IIbrerIe che ImpIemenlano molorI Ie-
gx quanlo dI pIu sempIIce sI possa de-
sIderare.
I`ImpIemenlazIone VScrIpl IeguIar
xpressIons 5.5 proprIo una dI quesle.
Ierch dunque non ulIIIzzarIa neIIe voslre
appIIcazIonI VIsuaI asIc, IeIphI e quan-
l`aIlro?
NeIIa prossIma ed uIlIma parle dI queslo
breve corso su Iegx esamIneremo In del-
lagIIo Ia ben pIu polenle ImpIemenlazIone
Iegx IornIla neI.NJ IrameworR ed Im-
pIemenleremo aIcune lecnIche moIlo soII-
slIcale che possono reaImenle mandare In pen-
sIone ognI aIlra Iorma lradIzIonaIe dI manIpo-
IazIone deIIe slrInghe.
NeI Irallempo esercIlalevI pure a lIrar IuorI
espressIonI regoIarI da quaIsIasI slrInga vI ca-
pIlI per Ie manI. polele anche (\s*comIncIare)
adesso.
%LEOLRJUDILD
j1| V. VessIa - IeguIar xpressIon IrIma Iar-
le, VIsuaI asIc JournaI n. ?4
5LIHULPHQWL
j2| V. VessIa Irogrammare II ceIIuIare - Hoe-
pII 2002 CapIloII 1 e 8.
42
>>
DEv > n.151 magglo 2007
di *LDQOXLJL'DYDVVL!davassi_inonedia.it
programmazlone 0RELOH
()LJXUD), che, per ortuna, appare solo la prina volta che
viene caricata la DLL. Possiano concedere il pernesso di
esecuzione ed ignorare il nessaggio.
xConcesso il pernesso... eureka! Prenendo il tasto an-
nirereno il nostro PocketPc spegnersi, e dopo 5 secondi
riaccendersi. Lna possibilit che la nornale J9 sicuranente
non prevede!
&RQFOXVLRQLHSRVVLELOLWjGLVYLOXSSR
A livello di progrannazione, nel caso si abbiano conoscenze
di C++, le possibilit di estendere la J9 attraverso JII sono
potenzialnente illinitate. Ad esenpi, possibile estendere
la J9 per ci che concerne la connettivit, il supporto sonoro,
il supporto graico, ino alla possibilit di inplenentare un
database SQL. E chiaro che se J9 inplenentasse un naggior
nunero di unzionalit acilnente utilizzabili, attirerebbe
un gran nunero di sviluppatori e di aziende disposte a in-
vestire nel nondo nobile utilizzando Java. E gi in corso
un progetto open source con questo obbiettivo, -RPHJD
(http://jonega.sourceorge.net). E un progetto che gestisco
personalnente ed inplenenta anche un porting delle OLE6'/
(http://vvv.libsdl.org) per la gestione della graica.
Le possibilit oerte dai dispositivi nobile sono ancora un
enoneno acerbo e poco sruttato, alneno qui in Italia.
*LDQOXLJL'DYDVVL
L:ar:/a : P|s: |n Innr|: In/arm:/|::, :pp:ss|an:/a J|
prar:mm::|an J| j:r:/C++ ` :a/anJ:/ar J| Om:Dr:m (|//p.
//uuu.am:-Jr:m.:am) an: sa:|/! sp:|:||:::/: n||a sr||appa
J| :pp||:::|an| s|s/m| sa J|spas|/|r| Ma|||. Cs/|s: an pra//a
apnsaar: :||:m:/a jOMECA (|//p.//am:.saar:/ar.n/), an:
|||rr|: :| s/nJ |: j9 ://r:rrsa j^I. A//a:|mn/ ` |mp|:/a
:||'|n/rna J||: Ksa|a/|ans (|//p.//uuu.|sa|a/|ans.|/) |:rar: :|
/r:muar| CMS apnsaar: K:|s/:rr (|//p.//uuu.|:|s/:r.ar).
Ionostante le ritrosie all'utilizzo quotidiano di questi di-
spositivi, le potenzialit del nobile in anbito aziendale ed
IT sono talnente esplosive da risultare quasi preoccupanti.
Le possibilit oerte da un Internet pervasivo, accessibile
dovunque e da chiunque sono destinate a canbiare il nostro
nodo di lavorare e di investire. Il nobile-connerce (al-
tres detto n-connerce) ad esenpio solo un petalo della
rosa del uturo che ci aspetta. Approondire lo sviluppo su
dispositivi Mobile, senpre connessi e pervasivi, incentivan-
do sull'utilizzo di tecnologie opensource (PhoneMe alle
porte e il Linux del tablet Iokia770 rappresenta un'ottina
alternativa a WindovsMobile) rappresenta uno degli scenari
pi interessanti del nostro uturo.
27
<<
DEv > n.149 marzo 2007
L: prar:mm::|an :an:arrn/ | /|r:J
della classe Thread che esegue la sincronizzazione ja|n().
Di atto, l'operazione di Join consiste nel bloccare il thread
chianante ino a che il thread speciicato non ternini.
Si veda, ad esenpio, il Listato 9 (C=) e la Figura 5. Si pu
notare che M:|n() si erna, dapprina, alla istruzione
tid1.Join()
in attesa che ternini il prino thread, poi alla istruzione
tid2.Join()
in attesa che ternini il secondo thread. Inine M:|n()
ternina. Da notare il passaggio di una variabile al thread
tranite il netodo S/:r/(r:r). In questo caso non pu essere
usata una istanza di 7|r:JS/:r/ na una istanza di P:r:m/-
r|:J7|r:JS/:r/. Il Listato 10 nostra la versione in C++.
I concetti, discussi in precedenza (nel caso C=), vengono
applicati parinenti.
Questa prina parte sui ondanenti ternina qui. Ho
introdotto, insiene ad alcuni concetti, le basi della pro-
grannazione nultitasking tranite i thread. Ho nostrato
alcuni esenpi riguardo la creazione dei thread, il signiicato
del oreground, del background e della priorit. Inine, ho
accennato ai principi della sincronizzazione.
Con questa base, senplice na necessaria, possiano arontare,
nel prossino nunero, concetti pi conplessi di sincronizza-
zione cone i nutex, i senaori, le sezioni critiche, gli eventi,
i neccanisni di conunicazione, ecc. Trattereno anche dei
deadlock, che si veriicano quando vi sono dei conlitti nella
sincronizzazione. Trattereno del debugging ed altro ancora.
Cvvianente, senpre con lo stesso stile. tranite esenpi.
*LRYDQQL9LYD
|:ar:/a |n I|s|:: J ` ://a:|mn/ |mp|:/a, :am rspans:|||
J||a sr||appa sa//u:r, |n RlS J| an: sa:|/! J| rappa S|x
I|nm:::n|::. Sra| ://|r|/! J| Ja:n:: pr Pram/|a,
:a||:|ar:nJa, |n p:r/|:a|:r, :an |: sJ J| Ram: Cn/ra. S|
a::ap:, /anJ:mn/:|mn/, J| s|s/m| p:r:||||, :an ::r://r|s/|:|
r:|-/|m J as: ||na:| C-||| (C, C++, C=, ::.). D:
a:|:| :nna |:rar: :an M|:rasa// I|sa:| S/aJ|a .^E7
H|nJaus CE.^E7 sa s|s/m| m|JJJ.
'RZQORDGGHOSURJHWWR
5carlca l| progeLLo comp|eLo dl quesLo arLlco|o a||'lndlrlzzo:
ftp:,,ftp.nfcmeda.t,pub,DEV.,Lstat,Dev149,Speca|e.zp

You might also like