Time-out
Handel ke sumber daya komunikasi memiliki serangkaian parameter waktu habis terkait yang memengaruhi perilaku operasi baca dan tulis. Waktu habis dapat menyebabkan operasi ReadFile, ReadFileEx, WriteFile, atau WriteFileEx menyimpulkan ketika interval waktu habis berlalu, meskipun jumlah karakter yang ditentukan belum dibaca atau ditulis. Ini tidak diperlakukan sebagai kesalahan ketika waktu habis terjadi selama operasi baca atau tulis (yaitu, nilai pengembalian fungsi baca atau tulis menunjukkan keberhasilan). Jumlah byte yang benar-benar dibaca atau ditulis dilaporkan oleh ReadFile atau WriteFile (atau oleh fungsi GetOverlappedResult atau FileIOCompletionRoutine, jika I/O dilakukan sebagai operasi yang tumpang tindih).
Saat aplikasi membuka sumber daya komunikasi, sistem mengatur nilai batas waktu sumber daya ke nilai yang berlaku saat sumber daya terakhir digunakan. Jika sumber daya komunikasi belum pernah dibuka, sistem mengatur nilai waktu habis ke beberapa nilai default. Dalam kedua kasus tersebut, aplikasi harus selalu menentukan nilai batas waktu saat ini setelah membuka sumber daya, lalu secara eksplisit mengaturnya untuk memenuhi persyaratannya. Untuk menentukan nilai batas waktu saat ini dari sumber daya komunikasi, gunakan fungsi GetCommTimeouts. Untuk mengubah nilai waktu habis, gunakan fungsi SetCommTimeouts.
Dua jenis waktu habis diaktifkan oleh parameter waktu habis. Batas waktu interval terjadi ketika waktu antara tanda terima dua karakter melebihi jumlah milidetik yang ditentukan. Waktu dimulai ketika karakter pertama diterima dan dimulai ulang ketika setiap karakter baru diterima. Total waktu habis terjadi ketika jumlah total waktu yang dikonsumsi oleh operasi baca melebihi jumlah milidetik yang dihitung. Waktu dimulai segera ketika operasi I/O dimulai. Operasi tulis hanya mendukung total waktu habis. Operasi baca mendukung interval dan total waktu habis, yang dapat digunakan secara terpisah atau digabungkan.
Waktu, dalam milidetik, dari total periode waktu habis untuk operasi baca atau tulis dihitung dengan menggunakan nilai pengali dan konstanta dari struktur COMMTIMEOUTS yang ditentukan dalam fungsi GetCommTimeouts atau SetCommTimeouts. Rumus berikut digunakan:
Timeout = (MULTIPLIER * number_of_bytes) + CONSTANT
Menggunakan pengali dan konstanta memungkinkan periode waktu habis total bervariasi, tergantung pada jumlah data yang diminta. Aplikasi hanya dapat menggunakan konstanta dengan mengatur pengali ke nol, atau hanya menggunakan pengali dengan mengatur konstanta ke nol. Jika konstanta dan pengali adalah nol, total waktu habis tidak digunakan.
Jika semua parameter waktu habis baca adalah nol, waktu habis baca tidak digunakan, dan operasi baca tidak selesai sampai jumlah byte yang diminta telah dibaca atau terjadi kesalahan. Demikian pula, jika semua parameter waktu habis tulis adalah nol, operasi tulis tidak selesai sampai jumlah byte yang diminta telah ditulis atau terjadi kesalahan.
Jika parameter batas waktu interval baca adalah nilai MAXDWORD dan parameter waktu habis total baca adalah nol, operasi baca selesai segera setelah membaca karakter apa pun yang tersedia di buffer input, bahkan jika kosong.
Waktu interval memaksa operasi baca untuk kembali ketika ada lull dalam penerimaan. Proses yang menggunakan batas waktu interval dapat mengatur parameter interval yang cukup singkat, sehingga dapat merespons dengan cepat ledakan kecil yang terisolasi dari satu atau beberapa karakter, namun masih dapat mengumpulkan buffer karakter besar dengan satu panggilan saat data diterima dalam aliran yang stabil.
Waktu habis untuk operasi tulis dapat berguna ketika transmisi diblokir oleh semacam kontrol aliran atau ketika fungsi SetCommBreak telah dipanggil untuk menangguhkan transmisi karakter.
Tabel berikut ini meringkas perilaku operasi baca berdasarkan nilai yang ditentukan untuk total dan batas waktu interval.
Total | Interval | Perilaku |
---|---|---|
0 | 0 | Mengembalikan ketika buffer benar-benar terisi. Waktu habis tidak digunakan. |
T | 0 | Mengembalikan ketika buffer benar-benar terisi atau ketika milidetik T telah berlalu sejak awal operasi. |
0 | Y | Mengembalikan ketika buffer benar-benar terisi atau ketika milidetik Y telah berlalu di antara tanda terima dari dua karakter. Waktu tidak dimulai sampai karakter pertama diterima. |
T | Y | Mengembalikan ketika buffer benar-benar terisi atau ketika salah satu jenis waktu habis terjadi. |
Catatan
Namun, waktu tersebut relatif terhadap sistem yang mengontrol perangkat fisik. Untuk perangkat jarak jauh seperti modem, waktu relatif terhadap sistem server tempat modem terpasang. Setiap penundaan penyebaran jaringan tidak diperhitungkan. Misalnya, aplikasi klien mungkin menentukan total waktu habis yang menghitung menjadi 500 milidetik. Ketika 500 milidetik telah berlalu di server, kesalahan waktu habis dikembalikan ke klien. Jika ada penundaan penyebaran jaringan 50 milidetik, klien tidak akan diberi tahu tentang waktu habis sampai sekitar 50 milidetik setelah waktu habis benar-benar terjadi.
Catatan
Parameter waktu habis memengaruhi perilaku operasi baca dan tulis yang tumpang tindih pada perangkat komunikasi. Dengan I/O yang tumpang tindih, fungsi ReadFile, WriteFile, ReadFileEx, atau WriteFileEx dapat kembali sebelum operasi selesai. Parameter waktu habis dapat menentukan kapan operasi telah selesai.