مدیریت تراکنش (مبادله داده)

ساخت وبلاگ

پس از برقراری مکالمه با یک سرور، مشتری می تواند تراکنش هایی را برای دریافت داده ها و خدمات از سرور ارسال کند.

موضوعات زیر انواع تراکنش هایی را که مشتریان می توانند برای تعامل با سرور استفاده کنند، شرح می دهند.

  • درخواست معامله
  • تراکنش پوک
  • مشاوره معامله
  • انجام تراکنش
  • تراکنش های همزمان و ناهمزمان
  • کنترل تراکنش
  • کلاس های تراکنش
  • انواع معاملات

درخواست معامله

یک برنامه مشتری می تواند از تراکنش XTYP_REQUEST برای درخواست یک مورد داده از برنامه سرور استفاده کند. کلاینت تابع DdeClientTransaction را فراخوانی می کند و XTYP_REQUEST را به عنوان نوع تراکنش مشخص می کند و آیتم داده مورد نیاز برنامه را مشخص می کند.

کتابخانه مدیریت تبادل داده پویا (DDEML) تراکنش XTYP_REQUEST را به سرور ارسال می کند و نام موضوع، نام مورد و فرمت داده درخواستی مشتری را مشخص می کند. اگر سرور از موضوع، مورد و قالب درخواستی پشتیبانی می کند، سرور باید دسته داده ای را برگرداند که مقدار فعلی مورد را مشخص می کند. DDEML این دسته را به عنوان مقدار بازگشتی از DdeClientTransaction به مشتری ارسال می کند. اگر از موضوع، مورد یا قالب درخواستی پشتیبانی نمی کند، سرور باید NULL را برگرداند.

DdeClientTransaction از پارامتر lpdwResult برای برگرداندن پرچم وضعیت تراکنش به مشتری استفاده می کند. اگر سرور تراکنش XTYP_REQUEST را پردازش نکند، DdeClientTransaction NULL را برمی گرداند و lpdwResult به پرچم DDE_FNOTPROCESSED یا DDE_FBUSY اشاره می کند. اگر پرچم DDE_FNOTPROCESSED برگردانده شود، مشتری نمی تواند تعیین کند که چرا سرور تراکنش را پردازش نکرده است.

اگر سروری از تراکنش XTYP_REQUEST پشتیبانی نمی کند، باید پرچم فیلتر CBF_FAIL_REQUESTS را در تابع DdeInitialize مشخص کند. این پرچم از ارسال تراکنش به سرور توسط DDEML جلوگیری می کند.

تراکنش پوک

یک کلاینت می تواند با استفاده از DdeClientTransaction داده های ناخواسته را به سرور ارسال کند تا یک تراکنش XTYP_POKE به عملکرد برگشت به تماس سرور ارسال کند.

برنامه کلاینت ابتدا بافری ایجاد می کند که حاوی داده هایی برای ارسال به سرور است و سپس یک اشاره گر به بافر به عنوان پارامتر به DdeClientTransaction می دهد. همچنین، سرویس گیرنده می تواند از تابع DdeCreateDataHandle برای به دست آوردن دسته داده ای استفاده کند که داده ها را شناسایی می کند و سپس دسته را به DdeClientTransaction ارسال می کند. در هر صورت، کلاینت هنگام فراخوانی DdeClientTransaction، نام موضوع، نام مورد و قالب داده را نیز مشخص می کند.

DDEML معامله XTYP_POKE را به سرور منتقل می کند و نام موضوع ، نام مورد و قالب داده ای را که مشتری درخواست کرده است مشخص می کند. برای پذیرش مورد و قالب داده ، سرور باید DDE_FACK را برگرداند. برای رد داده ها ، سرور باید DDE_FNOTPROCESS را برگرداند. اگر سرور برای پذیرش داده ها خیلی شلوغ است ، سرور باید DDE_FBUSY را برگرداند.

هنگامی که ddeclienttransaction بازگردد ، مشتری می تواند از پارامتر LPDWRESULT برای دسترسی به پرچم وضعیت معامله استفاده کند. اگر پرچم DDE_FBUSY باشد ، مشتری باید بعداً معامله را دوباره ارسال کند.

اگر یک سرور از معامله xtyp_poke پشتیبانی نکند ، باید پرچم فیلتر CBF_FAIL_POKES را در ddeinitialize مشخص کند. این پرچم مانع از ارسال DDEML این معامله به سرور می شود.

مشاوره معامله

یک برنامه مشتری می تواند از DDEML برای ایجاد یک یا چند پیوند به موارد موجود در یک برنامه سرور استفاده کند. هنگامی که چنین پیوندی برقرار شد ، سرور به روزرسانی های دوره ای در مورد مورد مرتبط را به مشتری ارسال می کند (به طور معمول ، هر زمان که مقدار مورد مرتبط با برنامه سرور تغییر کند). Linking یک حلقه مشاوره بین دو برنامه که تا زمانی که مشتری به پایان برسد در جای خود است ، ایجاد می کند.

دو نوع حلقه مشاوره وجود دارد: "داغ" و "گرم". در یک حلقه توصیه داغ ، سرور بلافاصله یک دسته داده را ارسال می کند که مقدار تغییر یافته را مشخص می کند. در یک حلقه توصیه گرم ، سرور به مشتری اطلاع می دهد که مقدار مورد تغییر کرده است اما تا زمانی که مشتری درخواست کند ، دسته داده را ارسال نمی کند.

مشتری می تواند با مشخص کردن نوع معامله XTYP_ADVSTART در تماس با ddeclienttransaction ، یک حلقه مشاوره داغ را با یک سرور درخواست کند. برای درخواست یک حلقه مشاوره گرم ، مشتری باید پرچم XTYPF_NODATA را با نوع معامله XTYP_ADVSTART ترکیب کند. در هر صورت ، DDEML معامله XTYP_ADVSTART را به عملکرد پاسخگویی به تبادل داده پویا سرور (DDE) منتقل می کند. عملکرد پاسخ به تماس DDE سرور باید پارامترهایی را که همراه با معامله XTYP_ADVSTART (از جمله قالب درخواست شده ، نام موضوع و نام مورد) است ، بررسی کند و سپس True را برگرداند تا اجازه دهد حلقه مشاوره یا کاذب آن را انکار کند.

پس از ایجاد یک حلقه مشاوره ، برنامه سرور باید هر زمان که مقدار مورد مرتبط با نام مورد درخواست شده تغییر کند ، با عملکرد DDEpostAdvise تماس بگیرد. این تماس منجر به معامله XTYP_ADVREQ می شود که به عملکرد پاسخ DDE خود سرور ارسال می شود. عملکرد پاسخ به تماس DDE سرور باید یک دسته داده را برگرداند که مقدار جدید مورد داده را مشخص کند. DDEML سپس به مشتری اطلاع می دهد که با ارسال معامله XTYP_ADVDATA به عملکرد پاسخ به تماس DDE مشتری ، مورد مشخص شده تغییر کرده است.

اگر مشتری درخواست یک حلقه مشاوره داغ کرد ، DDEML در طی معامله XTYP_ADVDATA ، دسته داده را به کالای تغییر یافته به مشتری منتقل می کند. در غیر این صورت ، مشتری می تواند یک معامله XTYP_REQUEST را برای به دست آوردن دسته داده ارسال کند.

این امکان وجود دارد که یک سرور سریعتر از آنچه مشتری می تواند داده های جدید را پردازش کند ، به روزرسانی ها را ارسال کند. سرعت به روزرسانی ها می تواند مشکلی برای مشتری باشد که باید عملیات پردازش طولانی را روی داده ها انجام دهد. در این حالت ، مشتری هنگام درخواست حلقه مشاوره باید پرچم XTYPF_ACKREQ را مشخص کند. این پرچم باعث می شود سرور منتظر بماند تا مشتری تصدیق کند که قبل از ارسال سرور مورد داده بعدی ، یک مورد داده را دریافت و پردازش کرده است. حلقه هایی را که با پرچم XTYPF_ACKREQ ایجاد شده اند ، با سرورهای سریع قوی تر هستند اما گاهی اوقات می توانند به روزرسانی ها را از دست بدهند. مشاوره حلقه های ایجاد شده بدون پرچم XTYPF_ACKREQ تضمین می شود تا زمانی که مشتری با سرور همراه باشد ، به روزرسانی ها را از دست ندهید.

مشتری می تواند با مشخص کردن نوع معامله XTYP_ADVSTOP در تماس با DDEClientTransaction ، یک حلقه مشاوره را به پایان برساند.

اگر یک سرور از حلقه های مشاوره پشتیبانی نمی کند ، باید پرچم فیلتر CBF_FAIL_ADVISES را در عملکرد ddeinitialize مشخص کند. این پرچم مانع از ارسال معاملات XTYP_ADVSTART و XTYP_ADVSTOP به سرور می شود.

انجام تراکنش

مشتری می تواند از معامله XTYP_EXECUTE استفاده کند تا باعث شود سرور یک دستور یا یک سری دستورات را اجرا کند.

برای اجرای یک دستور سرور ، ابتدا مشتری بافر ایجاد می کند که حاوی یک رشته فرمان برای اجرای سرور است و سپس یک نشانگر را به بافر یا یک دسته داده منتقل می کند که هنگام تماس با ddeclientTransaction ، بافر را مشخص می کند. سایر پارامترهای مورد نیاز شامل دسته مکالمه ، دسته رشته نام مورد ، مشخصات فرمت و نوع معاملات XTYP_EXECUTE است. برنامه ای که یک دسته داده را برای انتقال داده های اجرا ایجاد می کند ، باید پارامتر HSZITEM از عملکرد DDecreatedatahandle و صفر برای پارامتر UFMT را مشخص کند.

DDEML معامله XTYP_EXECUTE را به عملکرد پاسخ به تماس DDE سرور منتقل می کند و نام فرمت ، دسته مکالمه ، نام موضوع و دسته داده ها را مشخص می کند که رشته فرمان را مشخص می کند. اگر سرور از دستور پشتیبانی می کند ، باید از عملکرد DDEACCESSDATA استفاده کند تا یک اشاره گر به رشته فرمان بدست آید ، دستور را اجرا کند و سپس DDE_FACK را برگرداند. اگر سرور از دستور پشتیبانی نکند یا نتواند معامله را تکمیل کند ، باید DDE_FNOTPROCESS را برگرداند. اگر بیش از حد مشغول انجام معامله باشد ، سرور باید DDE_FBUSY را برگرداند.

به طور کلی ، عملکرد پاسخ به یک سرور باید قبل از بازگشت با استثنائات زیر ، معامله XTYP_EXECUTE را پردازش کند:

  1. هنگامی که این دستور با معامله XTYP_EXECUTE به سرور می خواهد خاتمه یابد ، سرور نباید خاتمه یابد تا عملکرد پاسخ به تماس خود از پردازش XTYP_EXECUTE بازگردد.
  2. اگر سرور باید عملیاتی را انجام دهد ، مانند پردازش کادر گفتگو یا معامله DDE که ممکن است باعث ایجاد مشکلات بازگشت DDEML شود ، سرور باید کد بازگشت CBR_Block را برای جلوگیری از معامله اجرا ، انجام عملیات و سپس از سرگیری پردازش معامله EXECUTE برگرداند. بشر

هنگامی که ddeclienttransaction بازگردد ، مشتری می تواند از پارامتر LPDWRESULT برای دسترسی به پرچم وضعیت معامله استفاده کند. اگر پرچم DDE_FBUSY باشد ، مشتری باید بعداً معامله را دوباره ارسال کند.

اگر یک سرور از معامله XTYP_EXECUTE پشتیبانی نمی کند ، باید پرچم فیلتر CBF_FAIL_EXECUTES را در عملکرد ddeinitialize مشخص کند. انجام این کار مانع از ارسال DDEML معامله به سرور می شود.

تراکنش های همزمان و ناهمزمان

مشتری می تواند معاملات همزمان یا ناهمزمان را ارسال کند. در یک معامله همزمان ، مشتری یک مقدار زمان را مشخص می کند که حداکثر مدت زمان انتظار برای پردازش سرور را نشان می دهد. DDECLientTransaction تا زمانی که سرور معامله را پردازش کند ، معامله انجام نمی شود ، یا مقدار زمان تمام می شود. مشتری هنگام تماس با DDECLientTransaction ، مقدار زمان را مشخص می کند.

در طی یک معامله همزمان ، مشتری در حالی که منتظر پردازش معامله است ، وارد یک حلقه معین می شود. مشتری هنوز هم می تواند ورودی کاربر را پردازش کند اما تا زمانی که DDECLientTransaction بازگردد ، نمی تواند معامله همزمان دیگری را ارسال کند.

مشتری با مشخص کردن پرچم TimeOut_Async در ddeclientTransaction یک معامله ناهمزمان ارسال می کند. عملکرد پس از شروع معامله باز می گردد و یک شناسه معامله را به مشتری منتقل می کند. هنگامی که سرور پردازش معامله ناهمزمان را به پایان رساند ، DDEML یک معامله XTYP_XACT_COMPLETE را به مشتری ارسال می کند. یکی از پارامترهایی که DDEML در طی معامله XTYP_XACT_COMPLETE به مشتری منتقل می شود ، شناسه معامله است. با مقایسه این شناسه معامله با شناسه برگشتی توسط DDECLientTransaction ، مشتری مشخص می کند که کدام معامله ناهمزمان سرور پردازش را به پایان رسانده است.

مشتری می تواند از عملکرد ddesetuserhandle به عنوان کمک در پردازش یک معامله ناهمزمان استفاده کند. این عملکرد باعث می شود مشتری بتواند یک مقدار تعریف شده از برنامه را با یک دسته مکالمه و یک شناسه معامله مرتبط کند. مشتری می تواند در طی معامله XTYP_XACT_COMPLETE از عملکرد DDequeryConvinfo استفاده کند تا مقدار تعریف شده برنامه را بدست آورد. به دلیل این عملکرد ، یک برنامه نیازی به لیستی از شناسه های معامله فعال ندارد.

هنگامی که مشتری با استفاده از یک معامله همزمان ، درخواست داده را با موفقیت انجام داد ، DDEML راهی برای گفتن زمان مشتری با استفاده از داده های دریافت شده ندارد. برنامه مشتری باید دسته داده های دریافت شده را به عملکرد ddefreedatahandle منتقل کند و به DDEML اطلاع دهد که دیگر از دسته استفاده نمی شود. دسته داده های برگشتی توسط معاملات همزمان به طور موثری متعلق به مشتری است.

اگر یک سرور یک معامله ناهمزمان را به موقع پردازش نکند ، مشتری می تواند با تماس با عملکرد DDEABandOntransaction ، معامله را رها کند. DDEML تمام منابع مرتبط با معامله را منتشر می کند و هنگامی که سرور پردازش آن را تمام می کند ، نتایج معامله را کنار می گذارد. یک زمان خارج از معامله همزمان ، معامله را به طور مؤثر لغو می کند.

روش معامله ناهمزمان برای برنامه هایی ارائه شده است که باید حجم بالایی از معاملات DDE را در حالی که همزمان انجام مقدار قابل توجهی از پردازش ، مانند انجام محاسبات را انجام می دهد ، ارسال کند. روش ناهمزمان همچنین در برنامه هایی که باید پردازش معاملات DDE را به طور موقت متوقف کنند ، مفید است تا بتوانند کارهای دیگری را بدون وقفه انجام دهند. در بیشتر شرایط دیگر ، یک برنامه باید از روش همزمان استفاده کند.

معاملات همزمان برای نگهداری ساده تر است و سریعتر از معاملات ناهمزمان است. با این حال ، تنها یک معامله همزمان می تواند به طور همزمان انجام شود ، در حالی که بسیاری از معاملات ناهمزمان می توانند به طور همزمان انجام شوند. با معاملات همزمان ، یک سرور آهسته می تواند باعث شود مشتری در حالی که منتظر پاسخ است ، بیکار بماند. همچنین ، معاملات همزمان باعث می شود مشتری یک حلقه معین را وارد کند که می تواند فیلتر پیام را در حلقه پیام خود برنامه دور کند.

اگر مشتری یک روش قلاب را برای فیلتر کردن پیام ها نصب کرده است (یعنی نوع WH_MSGFILTER HOOK را در تماس با عملکرد SetWindowShookex مشخص کرده است) ، یک معامله همزمان باعث نمی شود که سیستم از روش قلاب دور شود. هنگامی که یک رویداد ورودی رخ می دهد در حالی که مشتری منتظر پایان معامله همزمان است ، روش Hook یک کد قلاب MSGF_DDEMGR را دریافت می کند. خطر اصلی استفاده از یک حلقه معین معامله همزمان این است که یک حلقه معین ایجاد شده توسط یک کادر گفتگو می تواند در عملکرد آن تداخل داشته باشد. معاملات ناهمزمان همیشه باید هنگام استفاده از DDEML توسط DLL استفاده شود.

کنترل تراکنش

یک برنامه می تواند معاملات را به عملکرد پاسخ به پاسخ DDE خود یا آن معاملات مرتبط با یک دسته مکالمه خاص یا کلیه معاملات بدون در نظر گرفتن دسته مکالمه به حالت تعلیق درآورد. این قابلیت زمانی مفید است که یک برنامه معامله ای را دریافت کند که نیاز به پردازش طولانی داشته باشد. در چنین حالتی ، برنامه می تواند کد بازگشت CBR_Block را به حالت تعلیق در معاملات آینده مرتبط با دسته مکالمه معامله بازگرداند ، به طوری که برنامه برای پردازش سایر مکالمات رایگان است.

پس از اتمام پردازش ، برنامه با عملکرد ddeenablecallback تماس می گیرد تا معاملات مرتبط با مکالمه معلق را از سر بگیرد. تماس با ddeenableCallback باعث می شود DDEML معامله ای را انجام دهد که منجر به تعلیق برنامه شد. بنابراین ، برنامه باید نتیجه معامله را به گونه ای ذخیره کند که بتواند بدون پردازش معامله ، نتیجه را بدست آورد و نتیجه بگیرد.

یک برنامه می تواند تمام معاملات مرتبط با یک دسته مکالمه خاص را با مشخص کردن دسته و پرچم EC_DISABLE در تماس با ddeenablecallback به حالت تعلیق درآورد. با مشخص کردن یک دسته تهی ، یک برنامه می تواند کلیه معاملات را برای همه مکالمات به حالت تعلیق درآورد.

هنگامی که مکالمه به حالت تعلیق درآمده است ، DDEML معاملات مکالمه را در یک صف معامله ذخیره می کند. هنگامی که برنامه مکالمه را مجدداً امکان پذیر می کند ، DDEML معاملات ذخیره شده را از صف حذف می کند و هر معامله را به عملکرد پاسخ مناسب منتقل می کند. ظرفیت صف معامله بزرگ است ، اما یک برنامه باید در اسرع وقت مکالمه معلق را مجدداً مورد استفاده قرار دهد تا از دست دادن معاملات جلوگیری شود.

یک برنامه می تواند با مشخص کردن پرچم EC_ENABLEALL در ddeenableCallback ، پردازش معامله معمول را از سر بگیرد. برای از سرگیری کنترل شده تر از پردازش معامله ، برنامه می تواند پرچم EC_ENABLEONE را مشخص کند. این پرچم یک معامله را از صف معامله حذف می کند و آن را به عملکرد مناسب پاسخ به تماس منتقل می کند. پس از پردازش معامله ، هرگونه مکالمه دوباره غیرفعال می شود.

اگر پرچم EC_ENABLEONE و یک دسته مکالمه در تماس با DDeenableCallback مشخص شده باشد ، فقط این مکالمه پس از پردازش معامله مسدود می شود. اگر یک دسته مکالمه تهی مشخص شده باشد ، پس از پردازش معامله در هر مکالمه ، تمام مکالمات مسدود می شوند.

کلاس های تراکنش

DDEML دارای چهار کلاس تراکنش است. هر کلاس با یک ثابت مشخص می شود که با پیشوند XCLASS_ شروع می شود. کلاس ها در فایل هدر DDEML تعریف شده اند. مقدار کلاس با مقدار نوع تراکنش ترکیب می شود و به تابع تماس DDE برنامه دریافت کننده ارسال می شود.

کلاس تراکنش مقدار بازگشتی را تعیین می کند که انتظار می رود یک تابع برگشتی در صورت پردازش تراکنش، آن را برگرداند. مقادیر بازگشتی و انواع تراکنش های زیر با هر یک از چهار کلاس تراکنش مرتبط هستند.

 

کلاس ارزش برگشتی معامله
XCLASS_BOOL درست یا غلط XTYP_ADVSTART XTYP_CONNECT
XCLASS_DATA دسته داده، کد بازگشتی CBR_BLOCK یا NULL XTYP_ADVREQ XTYP_REQUEST XTYP_WILDCONNECT
XCLASS_FLAGS پرچم تراکنش: DDE_FACK، DDE_FBUSY، یا DDE_FNOTPROCESSED XTYP_ADVDATA XTYP_EXECUTE XTYP_POKE
XCLASS_NOTIFICATION هیچ یک XTYP_ADVSTOP XTYP_CONNECT_CONFIRM XTYP_DISCONNECT XTYP_ERROR XTYP_REGISTER XTYP_UNREGISTER XTYP_XACT_COMPLETE

انواع معاملات

هر نوع تراکنش DDE یک گیرنده و یک فعالیت مرتبط دارد که باعث می شود DDEML هر نوع را تولید کند.

 

نوع معامله گیرنده علت
XTYP_ADVDATA مشتری یک سرور با بازگرداندن دسته داده به تراکنش XTYP_ADVREQ پاسخ داد.
XTYP_ADVREQ سرور سروری به نام تابع DdePostAdvise که نشان می دهد مقدار یک آیتم داده در یک حلقه مشاوره تغییر کرده است.
XTYP_ADVSTART سرور یک کلاینت نوع تراکنش XTYP_ADVSTART را در تماسی با تابع DdeClientTransaction مشخص کرد.
XTYP_ADVSTOP سرور یک مشتری نوع تراکنش XTYP_ADVSTOP را در تماس با DdeClientTransaction مشخص کرد.
XTYP_CONNECT سرور یک کلاینت تابع DdeConnect را نامیده و نام سرویس و نام موضوعی را که توسط سرور پشتیبانی می شود مشخص کرده است.
XTYP_CONNECT_CONFIRM سرور سرور در پاسخ به تراکنش XTYP_CONNECT یا XTYP_WILDCONNECT، TRUE را برگرداند.
XTYP_DISCONNECT مشتری/سرور یک شریک در یک مکالمه به نام تابع DdeDisconnect که باعث می شود هر دو شریک این تراکنش را دریافت کنند.
XTYP_ERROR مشتری/سرور یک خطای حیاتی رخ داده است. DDEML ممکن است منابع کافی برای ادامه نداشته باشد.
XTYP_EXECUTE سرور یک مشتری نوع تراکنش XTYP_EXECUTE را در تماس با DdeClientTransaction مشخص کرد.
XTYP_MONITOR برنامه مانیتورینگ DDE یک رویداد DDE در سیستم رخ داد. برای اطلاعات بیشتر در مورد برنامه های نظارت DDE، به برنامه های نظارتی مراجعه کنید.
XTYP_POKE سرور یک مشتری نوع معامله xtyp_poke را در تماس با ddeclienttransaction مشخص کرد.
xtyp_register مشتری/سرور یک برنامه سرور از عملکرد Ddenameservice برای ثبت نام سرویس استفاده کرد.
xtyp_request سرور یک مشتری نوع معامله XTYP_REQUEST را در تماس با DDECLientTransaction مشخص کرد.
xtyp_unregister مشتری/سرور یک برنامه سرور از Ddenameservice برای ثبت نام سرویس استفاده کرد.
xtyp_wildconnect سرور مشتری به نام DDEConnect یا DDEConnectList با نام NULL برای نام سرویس ، نام موضوع یا هر دو.
xtyp_xact_complete مشتری یک معامله ناهمزمان ، ارسال شده هنگامی که مشتری پرچم TIMEOUT_ASYNC را در تماس با DDEClientTransaction مشخص کرد ، به پایان رسید.< SPAN> یک مشتری نوع معاملات XTYP_POKE را در تماس با DDECLientTransaction مشخص کرد.
حساب اسلامي...
ما را در سایت حساب اسلامي دنبال می کنید

برچسب : نویسنده : کامران فیوضات بازدید : 22 تاريخ : چهارشنبه 15 شهريور 1402 ساعت: 5:06