My_德意志 My_德意志
关注数: 71 粉丝数: 247 发帖数: 1,869 关注贴吧数: 16
C语言程序 操作系统实验二,代码二: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define M 10 /*缓冲数目*/ #define P(x) sem_wait(&x) #define V(x) sem_post(&x) int in = 0; /*生产者放置产品的位置*/ int out = 0; /*消费者取产品的位置*/ int buff[M] = {0}; /*缓冲初始化为0, 开始时没有产品*/ sem_t empty_sem; /*同步信号量,当满了时阻止生产者放产品*/ sem_t full_sem; /*同步信号量,当没产品时阻止消费者消费*/ pthread_mutex_t mutex; /*互斥信号量, 一次只有一个线程访问缓冲*/ /* *output the buffer */ void print() { int i; for(i = 0; i < M; i++) printf("%d ", buff[i]); printf("\n"); } /* *producer */ void *producer() { for(;;) { sleep(1); P(empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("(+)produce a product. buffer:"); buff[in] = 1; print(); ++in; pthread_mutex_unlock(&mutex); V(full_sem); } } /* *consumer */ void *consumer() { for(;;) { sleep(2); P(full_sem); pthread_mutex_lock(&mutex); out = out % M; printf("(-)consume a product. buffer:"); buff[out] = 0; print(); ++out; pthread_mutex_unlock(&mutex); V(empty_sem); } } void sem_mutex_init() { /* *semaphore initialize */ int init1 = sem_init(&empty_sem, 0, M); int init2 = sem_init(&full_sem, 0, 0); if( (init1 != 0) && (init2 != 0)) { printf("sem init failed \n"); exit(1); } /* *mutex initialize */ int init3 = pthread_mutex_init(&mutex, NULL); if(init3 != 0) { printf("mutex init failed \n"); exit(1); } } int main() { pthread_t id1; pthread_t id2; int i; int ret; sem_mutex_init(); /*create the producer thread*/ ret = pthread_create(&id1, NULL, producer, NULL); if(ret != 0) { printf("producer creation failed \n"); exit(1); } /*create the consumer thread*/ ret = pthread_create(&id2, NULL, consumer, NULL); if(ret != 0) { printf("consumer creation failed \n"); exit(1); } pthread_join(id1,NULL); pthread_join(id2,NULL); exit(0); }
搞了一天C语言多线程问题,真心求帮助 事情是这样的,我想做一个程序,定时关机,要用到一点多线程,但多线程困扰了我一天,实在解决不了,所以来提问。(这个程序还不完整) 现在的程序是正常的,但没有用到多线程。但是如果要用多线程的话,(用那两行注释,并且注释掉上面两行),local的值就不对了,输出的就像这样: Local hour is: 1953719636:1550148719:1130117701 我的目的是要像这样:Local hour is: 20:41:11。 猜想应该是参数问题,但感觉注释部分跟没注释部分并没有什么区别。 希望知道问题在哪里,还有怎么改。 #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> #include <string.h> #include <pthread.h> char *transition(struct tm *local); void print(struct tm **local); int main(void) { pthread_t t1; struct tm *local; char *ss=(char *)malloc(50*sizeof(char)); print(&local); printf("Local hour is: %d:%d:%d\n",(local)->tm_hour,(local)->tm_min,(local)->tm_sec); //pthread_create(&t1,NULL,print,&local); //printf("Local hour is: %d:%d:%d\n",(local)->tm_hour,(local)->tm_min,(local)->tm_sec); strcpy(ss,transition(local)); printf("%s",ss); return 0; } void print(struct tm **local){ time_t t; t=time(NULL); *local=localtime(&t); //printf("Local hour is: %d:%d:%d",(*local)->tm_hour,(*local)->tm_min,(*local)->tm_sec); } char *transition(struct tm *local){ //这个函数的功能是,根据local,算出现在的时间距离所输入时间的秒数,并生成字符串。 //比如现在是22:00.输入23:00,则返回字符串“shutdown -s -t 3600”。 int h,m,s;//hours,mins,secs long ls=0;//剩余秒数 scanf("%d:%d:%d",&h,&m,&s);//需要判断合法性 ls = (h-local->tm_hour)*3600 + (m-local->tm_min)*60 + (s-local->tm_sec); char *s1=(char *)malloc(20*sizeof(char)),*s2=(char *)malloc(40*sizeof(char)); int i=0,k=0; for(;ls!=0;i++){ s1[i]=ls%10+48; ls/=10; } s1[i]='\0'; for(--i;i>=0;i--){ s2[k++]=s1[i]; } s2[k]='\0'; char s3[50]="shutdown -s -t "; strcat(s3,s2); return s3; }
请问:如何通过按按钮来更改标签的图片 把标签设置成图片,我想通过按按钮来更改它,但是我按了按钮标签没有发生变化。请问代码应该怎么改? package 剪刀石头布; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class S2 extends JFrame implements ActionListener{ JFrame jf=new JFrame(); JPanel mp1=new JPanel(); JPanel mp2=new JPanel(); JPanel mp3=new JPanel(); JPanel mp4=new JPanel(); JPanel mp5=new JPanel(); String me="布1.png"; String bot=new String(); JLabel jlabel1=new JLabel(new ImageIcon(me)); JLabel jlabel2=new JLabel(new ImageIcon(bot)); JLabel jlabel3=new JLabel("VS"); JLabel jlabel4=new JLabel("结果"); JLabel jlabel5=new JLabel("选"); JLabel jlabel6=new JLabel("关"); JLabel jlabel7=new JLabel("请选"); JLabel jlabel8=new JLabel("得分:"); JLabel jlabel9=new JLabel("得分:"); JButton btn1=new JButton("剪刀"); JButton btn2=new JButton("石头"); JButton btn3=new JButton("布"); JTextField text=new JTextField(3); public S2(){ super(); jf.setVisible(true); jf.setSize(600, 450); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); init(); } public void paint(Graphics g) { } public void init(){ mp1.add(jlabel1); mp1.add(jlabel2); mp1.add(jlabel3); mp2.add(jlabel4); mp3.add(jlabel5); mp3.add(text); mp3.add(jlabel6); mp4.add(jlabel7); mp4.add(btn1); mp4.add(btn2); mp4.add(btn3); mp5.add(jlabel8); mp5.add(jlabel9); btn1.addActionListener(this); btn2.addActionListener(this); btn3.addActionListener(this); jf.setLayout(new GridLayout(5,1,7,7)); jf.add(mp1); jf.add(mp2); jf.add(mp3); jf.add(mp4); jf.add(mp5); } public void actionPerformed(ActionEvent e){ if(e.getSource()==btn1){ me="剪刀1.png"; System.out.println("JIANDAO"); System.out.println(me); jlabel1=new JLabel(new ImageIcon(me)); } if(e.getSource()==btn2){ me="石头1.png";} if(e.getSource()==btn3){ me="布1.png";} } public static void main(String[] args){ S2 s2=new S2(); } }
1 下一页