बिल्कुल के रूप में यह लग रहा है, मैं अतुल्यकालिक ReadDirectoryChangesW
आईओ समापन के साथ प्रयास कर रहा हूँ और यह काम नहीं कर रहा है, विशेष रूप से, GetLastError
बार-बार रिटर्न 258 (GetQueuedCompletionStatus
का समय समाप्त)।अतुल्यकालिक ReadDirectoryChangesW - GetQueuedCompletionStatus हमेशा समय समाप्त
typedef struct dirinfo_struct
{
HANDLE hDirFH; // directory handle
OVERLAPPED Overlapped; // overlapped storage
int len_buffer; // buffer length
wchar_t* buffer; // buffer itself
wchar_t* directory_name; // target name
} dirinfo_t;
typedef struct dirmon_struct
{
HANDLE hDirOPPort; // handle to the IO port.
dirinfo_t* dirinfo; // pointer to the struct above.
} dirmon_t;
प्रासंगिक जानकारी संग्रहीत करने के लिए:
मैं structs की है। यह initialised है:
t->hDirFH = CreateFile(L"C:\\test",
FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
NULL);
d->dirinfo = t;
d->hDirOPPort = CreateIoCompletionPort(d->dirinfo->hDirFH,
NULL,
(ULONG_PTR)(d->dirinfo),
1);
तो मैं एक नया धागा करने के लिए घ के माध्यम से इस जानकारी को पारित:
dirinfo_t* t = malloc(1*sizeof(dirinfo_t));
dirmon_t* d = malloc(1*sizeof(dirmon_t));
dirinfo_init(t); // does t->buffer = malloc(8192*sizeof(wchar_t));
तब मैं अपने निर्देशिका हैंडल और कॉम पोर्ट पैदा करते हैं। अब को कहा नई धागा मेरे पास है:
bResultQ = GetQueuedCompletionStatus(d->hDirOPPort, lpBytes,
(ULONG_PTR*)d->dirinfo,
lpOverlapped, 1000);
if (bResultQ)
{
bResultR = ReadDirectoryChangesW(d->dirinfo->hDirFH,
(void*)d->dirinfo->buffer,
8192, TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME |
FILE_NOTIFY_CHANGE_DIR_NAME |
FILE_NOTIFY_CHANGE_ATTRIBUTES |
FILE_NOTIFY_CHANGE_SIZE |
FILE_NOTIFY_CHANGE_LAST_WRITE |
FILE_NOTIFY_CHANGE_LAST_ACCESS |
FILE_NOTIFY_CHANGE_CREATION |
FILE_NOTIFY_CHANGE_SECURITY,
lpReadDirBytes,
&d->dirinfo->Overlapped,
NULL);
}
else
{
printf("GetQueuedCompletionStatus(): Failed, ");
errorcode = GetLastError();
printf("Error Code %d\n", errorcode);
Sleep(500);
}
तो मैं इस बंद चल रहा सेट और मैं ख़ुशी से के रूप में मैं चाहिए समय समाप्ति (258 त्रुटियों) पाने के बाद से निर्देशिका नहीं बदला है। हालांकि, भले ही मैं निर्देशिका को बदलूं, फिर भी मुझे त्रुटि संदेश मिल रहे हैं; दूसरे शब्दों में उन बदलावों को उठाया नहीं जा रहा है। जो मुझे विश्वास दिलाता है कि मुझे यह सेट गलत तरीके से मिला है।
कोई विचार?
चेतावनियां:
- विडंबना यह है कि यह अंततः अजगर को pywin32 के माध्यम से परिवर्तित किया जाएगा। हालांकि, जब तक मैं समझ नहीं पाता कि यह सी में कैसे काम करना है, मैं वहां नहीं जा रहा हूं।
- तुल्यकालिक
ReadDirectoryChangesW
एक विकल्प नहीं है। यदि कोई घटना नहीं निकाल दी जाती है, तो मुझे थ्रेड की आवश्यकता होती है जो यह टाइमआउट पर है ताकि यह जांच सके कि यह अभी भी चल रहा है या नहीं। - मैं विशेष रूप से सी ++ में सी में लिख रहा हूं।
FindFirstChangeNotification
आदि कोई विकल्प नहीं है - मैं लगातार बदलकर काम करने के लिए निर्देशिका सूची की तुलना करना नहीं चाहता हूं।
अन्य नोट:
- निर्देशिका मौजूद है, कि संभाल शून्य नहीं है। इसी तरह कॉम्पोर्ट हैंडल के लिए।
- सब कुछ धागा
मैं कोड परियोजना से CDirectoryChangeWatcher पर एक नज़र लिया है करने के लिए पारित किया जा रहा है, लेकिन एक तरफ सी के ++ उपयोग कई और अधिक धागे, मैं नहीं देख सकते हैं कि मैं क्या अलग तरह से कर रहा हूँ। अगर मुझे कुछ याद आ रहा है तो इसे इंगित करने के लिए स्वतंत्र महसूस करें!
आउटपुट, यदि यह मदद करता है, मूल रूप से दोहराया जाता है, इससे कोई फर्क नहीं पड़ता कि मैं निर्देशिका में कितना बदलता हूं।
GetQueuedCompletionStatus(): Failed, Error Code 258
इसे अच्छी तरह से काम करने के लिए यह गैर-तुच्छ (इसे हल्के ढंग से रखने के लिए) प्राप्त करना है। यदि आपने अभी तक नहीं किया है, तो मैं जिम बेवरिज के ब्लॉग को पढ़ने पर सलाह दूंगा: http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html। चेतावनी: उसका नमूना कोड सी ++ में है, लेकिन कम से कम यह अधिक से बेहतर है। चेतावनी 2: मैं निश्चित रूप से निश्चित हूं कि आप जो भी करते हैं, कोई फर्क नहीं पड़ता, ReadDirectoryChangesW वास्तव में पूरी तरह से सही ढंग से काम नहीं करेगा। मैं आमतौर पर बदले में परिवर्तन पत्रिकाओं का उपयोग करने की सलाह देता हूं। http://msdn.microsoft.com/en-us/library/aa363798.aspx। वे या तो तुच्छ नहीं हैं, लेकिन कम से कम वे काम करते हैं। –
@ जेफी धन्यवाद, मैंने उसके स्रोत पर एक नज़र डाली थी, लेकिन वह (जहां तक मैं देख सकता हूं) GetQueue का उपयोग नहीं करता ... या CreateIo ... उसका रीडमी वास्तव में वहां से अधिक फ़ाइलों का तात्पर्य है इसलिए मैं सोच रहा हूं उसने उन्हें हटा दिया है। मैं धीरे-धीरे इस प्राप्ति के लिए आना शुरू कर रहा हूं ... दुर्भाग्य से पत्रिकाओं को बदलने के लिए व्यवस्थापकीय विशेषाधिकारों की आवश्यकता होती है जो हमारे पास नहीं हो सकते हैं। मुझे लगता है कि मैं संभालने के लिए हमेशा एक विंडोज़ सेवा बंद कर सकता हूं। –